PDA

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

robert
14/12/05, 16:00
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 ....)

robert
14/12/05, 18:00
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

robert
14/12/05, 19:30
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