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>');

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *