[PHP] Pattern syntax probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Oké, ik kom er niet meer uit.

Stel, dit is de input (string).

code:
1
<url>http://www.bla.nl</url> en <url>http://www.blo.nl</url>


Die teksten tussen de <url>...</url> elementen moeten door PHP worden vervangen met simpele A-elementen. Dus zal het zo moeten worden:

code:
1
2
<a href="http://www.bla.nl">http://www.bla.nl</a> en 
<a href="http://www.blo.nl">http://www.blo.nl</a>



Nu heb ik de volgende PHP-code die dit bovenstaande voor mij omzet:

code:
1
2
3
  $ret=preg_replace("\&lt;url\&gt;(http://.*)\&lt;/url\&gt;",
     "<a href=\"\\1\">\\1</a>",
     $ret);


Het werkt maar niet zoals ik had verwacht. De tussengelegen tekst "en" wordt ook een hyperlink. Wat PHP niet ziet is dat er twee blokken van <url>...</url> zijn maar hij maakt er één van. De eerste <url> (voor bla.nl) combineert hij met de laatste </url> (na blo.nl). Kortom, je krijgt één lange hyperlink.

Dit heb ik al enkele dagen maar ik zie gewoon niet wat ik fout doe. Andere functeis als preg_replace_callback hebben mij ook hierin niet geholpen, dus denk ik een fout in de pattern syntax.

Wie kan mij de gouden tip geven?

Acties:
  • 0 Henk 'm!

Verwijderd

Als je van .* nu eens .*? maakt dan werkt het waarschijnlijk al beter. Als je een ? na een modifier (+ of ? of *) gebruikt, dan maak je hem ungreedy.

Acties:
  • 0 Henk 'm!

  • satcp
  • Registratie: Februari 2000
  • Niet online
PHP:
1
2
$ret = "<url>http://www.bla.nl</url> en <url>http://www.blo.nl</url>";
$ret = preg_replace("!<url>(.+)</url>!Uis", "<a href=\"\\1\">\\1</a>", $ret);


Als je wil controleren op de aanwezigheid van http:// moet je dat er nog wel effe tussen zetten.

[ Voor 70% gewijzigd door satcp op 19-04-2004 21:19 . Reden: Idd 2 ongebruikte capturing groups. Dat heb je als je snel wilt zijn :) ]


Acties:
  • 0 Henk 'm!

Verwijderd

Dan kun je beter dit doen:
PHP:
1
preg_replace('!<url>(.+?)</url>!Uis', '<a href="\\1">\\1</a>', $ret)

Scheelt 2 ongebruikte capturing groups, 2 keer escapen en 4 keer nutteloos escapen.

[ Voor 19% gewijzigd door Verwijderd op 19-04-2004 21:39 . Reden: daar hoorde idd ook een ? ]


Acties:
  • 0 Henk 'm!

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Cheatah, bedankt :) Je hebt me goed op weg geholpen.

Alleen je laatste voorbeeld (gelijk hierboven) werkt niet. Maar met de ? achter .* laat het wel goed werken.

SatCP ook bedankt voor het meedenken.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

zo dan:

PHP:
1
2
3
4
5
$ret = '<url>http://www.bla.nl</url> en <url>http://www.blo.nl</url>';

$ret = preg_replace('!<url>(.+?)</url>!is', '<a href="$1">$1</a>', $ret);

echo $ret;


Cheatah deed trouwens dubbel ungreedy, en ik hou van de $-notatie voor replacements ;)

Intentionally left blank

Pagina: 1