RegExp “alles außer” Denkfehler

Wenn man in PHP durch die Funktion preg_replace() zwischen zwei beliebigen Markierungen (z.B. HTML-Tags) den Inhalt ersetzen will, dann ist das erst einmal einfach möglich:

preg_replace('/<.*>(.*)<\/.*>/', 'Michael', 'Guten Tag, <span>Gast</span>!');

Bei einer Erweiterung ergibt sich jedoch schnell das Problem, dass diese Markierungen entweder nur einmal im gesamten Text ($subject) vorkommen darf. Kommen die Markierungen mehrmals vor, so ersetzt preg_replace() den Inhalt zwischen der allerersten und der allerletzten Markierung. Das ist meistens unerwünscht.

Wer mit regulären Ausdrücken noch nicht sehr erfahren ist, versucht nun durch Modifikation des Suchmusters zu verhindern, dass zwischen den Markierungen die Markierungen nochmals vorkommen, also etwas nach dem Schema: “Finde alles außer die Markierungen zwischen den Markierungen!”. Damit ist man in die Falle getappt und vertrödelt endlos Zeit.

Die Lösung

Stattdessen gibt es den einfachen Modifier U. Dieser steht für ungreedy. Er bewirkt, dass die RegExp-Engine versucht, den kleinstmöglichen Text zu finden. (Standard ist greedy).
Wir suchen also folgendermaßen:

preg_replace('/<.*>(.*)<\/.*>/U', 'Michael', 'Guten Tag, <span>Gast</span>! Auf Wiedersehen, <span>Gast</span>');
Dieser Eintrag wurde veröffentlicht in Tutorials, Web-Entwicklung und getagged , , , , , , . Bookmarken: Permanent-Link. Kommentieren oder ein Trackback hinterlassen: Trackback-URL.

Ihr Kommentar

Ihre E-Mail wird niemals veröffentlicht oder verteilt. Benötigte Felder sind mit * markiert

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

  • Neueste Kommentare

  • Kategorien

  • The next version of Ubuntu is coming soon
Get Adobe Flash playerPlugin by wpburn.com wordpress themes