[PHP] Hoe woord te extraheren dat tussen [ en ] staat?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 07-09 20:41

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Hiya, ik wordt helemaal scheel van de zaken die ik tegenkom over preg_match, al denk ik wel dat de oplossing wel in die hoek zit:

Ik heb een variabele met een lange tekst waarin ergens een tekstje tussen [ en ] staat, bv "bla bla bla bla bla bla [insertimage,4,300,400] bla blabla bla bla"

Nu lukt het me wel met preg_match om er achter te komen dat er iets aanwezig is tussen de [ en ], maar ik wil juist eruit kunnen halen wat er tussen staat. Maar als ik google enzo op "php find content between brackets" ofzo kom ik nergens.

Iemand een suggestie?
Thanx!
Dr.B


EDIT:
Nou jaaaaa nu vind ik het toch op Google, probleem opgelost! Ik zal het meteen hier even herhalen voor wie het interesseert:
code:
1
2
3
4
5
$sentence = "Le petit chat est mort [Theo Gautier]";
preg_match("/(\\[\s*)(.+?)(\s*\])/", $sentence, $match);
echo $match[2];

print Theo Gautier.

[ Voor 23% gewijzigd door Dr.Bob op 27-04-2006 17:30 ]

NERDCORE FOR LIFE


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dr.Bob schreef op donderdag 27 april 2006 @ 17:27:
Maar als ik google enzo op "php find content between brackets" ofzo kom ik nergens.
offtopic:
Je zoekt dan ook wel heel specifiek. Ik zou zelf gegoogled hebben op "php preg match substring" (ofzo). Dat het tussen brackets moet staan is natuurlijk bijzaak, als je een voorbeeld kunt vinden waar het tussen sterretjes, accolades, komma's of andere dingen staat kun je dat natuurlijk ook ombouwen naar je gewenste brackets.

Maar goed, da's mierenneuken.. ;)

[ Voor 13% gewijzigd door RobIII op 27-04-2006 17:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 22:41
Als je zeker weet dat er maar 1x [ en ] voorkomt, kan het ook op de volgende manier:
PHP:
1
2
3
$kort = explode('[',$invoer);
$kort = explode(']',$kort[1]);
$kort = $kort[0];

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
EdwinG schreef op donderdag 27 april 2006 @ 22:55:
Als je zeker weet dat er maar 1x [ en ] voorkomt, kan het ook op de volgende manier:
PHP:
1
2
3
$kort = explode('[',$invoer);
$kort = explode(']',$kort[1]);
$kort = $kort[0];
Dat werkt inderdaad ook, maar het is geen bijster efficiente methode. Je kopieert de string nu anderhalf keer naar het geheugen en laat PHP twee keer de string doorzoeken. Een regex is wat dat betreft efficienter, bovendien is het met een regex duidelijker wat de code doet.

Qua regex zou ik verder trouwens niet die uit de topicstart gebruiken, die staat het namelijk toe om '[' binnen je tag te hebben. Hierdoor match je
PHP:
1
$str = '<<om een tag te openen gebruik je "[">> [T-MOB]';
alszijnde ">> [T-MOB, terwijl het me de bedoeling lijkt om alleen T-MOB te matchen :). Bovendien zitten er wat redundante backreferences in. Volgens mij is dit voldoende:
PHP:
1
2
$regex = '/\\[([^\]\\[]+)\]/';
preg_match($regex, $invoer, $match);

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 07-09 20:41

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Interessant, ik ga ook es met die laatste optie spelen!
Thanx!

NERDCORE FOR LIFE


Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19
Waarom een regular expression gebruiken als het ook zonder kan ?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$tekst = <<<TEXT
dit is een stuk tekst en af en toe staat er een [woord] tussen [vierkante][haken]
dit zijn speciale stukken tekst die we willen [filteren] uit deze [tekst].
[Of we kunnen een volledige zin tussen vierkante haaken plaatsen]
TEXT;


$found = array();

$pos2 = 0;
while( ( $pos = strpos( $tekst , "[" , $pos2 ) ) !== false ) {
    if( ( $pos2 = strpos( $tekst , "]" , $pos ) ) !== false ) {
        $found[] = substr( $tekst , $pos + 1 , $pos2 - $pos - 1 );
        $pos2++;
    } else {
        break;
    }
}

print_r( $found );

code:
1
2
3
4
5
6
7
8
9
Array
(
    [0] => woord
    [1] => vierkante
    [2] => haken
    [3] => filteren
    [4] => tekst
    [5] => Of we kunnen een volledige zin tussen vierkante haaken plaatsen
)


Dit stukje code laat wel een extra [ toe in een "tag" , maar dit is ook gemakkelijk op te vangen indien nodig.

Acties:
  • 0 Henk 'm!

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
yiko schreef op vrijdag 28 april 2006 @ 10:16:
Waarom een regular expression gebruiken als het ook zonder kan ?
Omdat je met een regular expression in een regel code kan doen wat jij met 10 regels code doet. Met jouw argument kan je wel net zo goed nooit regular expressions gebruiken want je kan altijd een stuk string parsing code schrijven wat hetzelfde doet als een of andere regular expression.

Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19
Ik beweer ook niet dat je nooit regular expressions mag gebruiken, ik gebruik ze genoeg. Maar voor simpele zaken, zoals hier het geval is, is het zeker niet nodig. Het is zelf iets sneller in dit geval om gewoon met strpos te werken. Niet dat het verschil zo groot is. :)
Ieder zijn smaak en gedacht natuurlijk ;)

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 22:41
Een andere oplossing die ik wel eens gebruikt heb: (geen idee hoe efficiënt deze is):
PHP:
1
$woord = preg_replace('/(.*)\\[([a-z0-9]+)\](.*)/is','$2',$invoer);

Bezoek eens een willekeurige pagina

Pagina: 1