Bekijk Volledige Versie : PHP regular expressions en square brackets
Jan Kuiken
14/12/05, 15:45
ik wil in teksten dingen als [i:plaatje01.jpg] vervangen door
<img src="plaatje01.jpg">
en doe dit met
$inStr = ereg_replace('\[i:(.*)\]','<img src="\\1">",$inStr);
dit gaat fout als er twee keer iets als [i:xxx] in de tekst voorkomt.
In dat geval wordt de eerste [i: gematcht met de laatste ] .
Het volgende plan was om de (.*) uit de expressie te vervangen
door ([^\]]*) met de bedoeling om alles te matchen tot een ] ,
maar er wordt helemaal niets gematcht.
Het lijkt erop dat het escape karakter \ en de 'not' ^ niet goed
samen gaan.
Wie weet raad?
Jan Kuiken
Jan Kuiken <jan.kuiken@chello.nl>:
> ik wil in teksten dingen als [i:plaatje01.jpg] vervangen door
> <img src="plaatje01.jpg">
> en doe dit met
> $inStr = ereg_replace('\[i:(.*)\]','<img src="\\1">",$inStr);
>
> dit gaat fout als er twee keer iets als [i:xxx] in de tekst voorkomt.
> In dat geval wordt de eerste [i: gematcht met de laatste ] .
Perl-compatible RE's gebruiken en non-greedy matchen:
$inStr = preg_replace('\[i:(.*?)\]','<img src="\\1">",$inStr);
^ = non-greedy, eindigen bij de eerste ']'
--
robert
Jan Kuiken
14/12/05, 17:30
robert wrote:
> Jan Kuiken <jan.kuiken@chello.nl>:
> > ik wil in teksten dingen als [i:plaatje01.jpg] vervangen door
> > <img src="plaatje01.jpg">
> > en doe dit met
> > $inStr = ereg_replace('\[i:(.*)\]','<img src="\\1">",$inStr);
> >
> > dit gaat fout als er twee keer iets als [i:xxx] in de tekst voorkomt.
> > In dat geval wordt de eerste [i: gematcht met de laatste ] .
>
> Perl-compatible RE's gebruiken en non-greedy matchen:
> $inStr = preg_replace('\[i:(.*?)\]','<img src="\\1">",$inStr);
> ^ = non-greedy, eindigen bij de eerste ']'
>
Mijn dank is groot, ik kreeg nog wel een foutmelding maar door de RE
te beginnen en eindigen met een / werkte het.
$inStr = preg_replace('/\[i:(.*?)\]/', ....
Jan Kuiken (, die RE's soms behoorlijk trickey blijft vinden ....)
Jan Kuiken <jan.kuiken@chello.nl>:
> Mijn dank is groot, ik kreeg nog wel een foutmelding maar door de RE
> te beginnen en eindigen met een / werkte het.
Ah ja, dat suffe PHP weer... ;)
--
robert
Jan Kuiken
14/12/05, 19:00
robert wrote:
> Jan Kuiken <jan.kuiken@chello.nl>:
> > Mijn dank is groot, ik kreeg nog wel een foutmelding maar door de RE
> > te beginnen en eindigen met een / werkte het.
>
> Ah ja, dat suffe PHP weer... ;)
Nou nou nou, jij durft, ... PHP suf noemen ...
Enfin, ik heb een werkende oplossing maar weet nog niet waarom
de RE ([^\]]*) niet doet wat ik hoopte dat ie zou doen. Ik ga
nog even wat documentatie doorspitten.
Jan Kuiken
Jan Kuiken <jan.kuiken@chello.nl>:
> robert wrote:
>> Jan Kuiken <jan.kuiken@chello.nl>:
>> > Mijn dank is groot, ik kreeg nog wel een foutmelding maar door de RE
>> > te beginnen en eindigen met een / werkte het.
>>
>> Ah ja, dat suffe PHP weer... ;)
>
> Nou nou nou, jij durft, ... PHP suf noemen ...
>
> Enfin, ik heb een werkende oplossing maar weet nog niet waarom de RE
> ([^\]]*) niet doet wat ik hoopte dat ie zou doen.
Tussen [] mag je de ] (als karakter) niet escapen; dit werkt wel:
ereg_replace('\[i:([^]]*)\]', "<img src='\\1'>", $inStr);
Je moet er overigens rekening mee houden dat de ']' in zo'n bracket
expression het eerste karakter in de lijst moet zijn, afgezien van een
eventuele '^'.
--
robert
Jan Kuiken
14/12/05, 20:45
robert wrote:
> > Enfin, ik heb een werkende oplossing maar weet nog niet waarom de RE
> > ([^\]]*) niet doet wat ik hoopte dat ie zou doen.
> Tussen [] mag je de ] (als karakter) niet escapen; dit werkt wel:
> ereg_replace('\[i:([^]]*)\]', "<img src='\\1'>", $inStr);
Check! , deze werkt ook.
blijft lastig, uitzondering op uitzondering ....
> Je moet er overigens rekening mee houden dat de ']' in zo'n bracket
> expression het eerste karakter in de lijst moet zijn, afgezien van een
> eventuele '^'.
.... en dan nog een extra voorwaarde
Jan Kuiken