de.comp.lang.php.* FAQ

8.13. Hilfe, mein Regulärer Ausdruck frißt zuviel!

Keywords: ungreedy

Antwort von Johannes Frömter

Setzt man in einem Regulären Ausdruck sogenannte Quantifier (?, *, + und {n,m}) ein, weil ein Teil des Ausdrucks in variabler Anzahl vorkommen darf, so versuchen diese grundsätzlich, so viele Zeichen wie nur möglich zu "fressen" (ohne dabei den Ausdruck scheitern zu lassen). Diese Eigenschaft wird "gierig" (engl. "greedy") genannt. Da dieses Verhalten nicht immer gewünscht ist, läßt sich die Gierigkeit (Greediness) umschalten - ein Quantifier frißt dann nur so viele Zeichen wie nötig, jedoch so wenig wie möglich.

Diese Umschaltung läßt sich entweder durch den Modifier U (wie ungreedy) für alle Quantifier im gesamten Ausdruck, oder durch ein nachgestelltes ? (Fragezeichen) für einen einzelnen Quantifier realisieren. Auch eine Kombination ist möglich - d.h. erst mittels U die Quantifier normalerweise ungreedy zu machen, einzelne davon durch ein ? jedoch wieder greedy. Anhand folgender Beispiele ist zu sehen, wieviele Zeichen der Ausdruck .* je nach Greediness verschlingt - mal ist er mit dem erstbesten r zufrieden, mal nimmt er alles bis zum letztmöglichen r mit:

$string  = 'Dieser Satz wird fast gefressen';

// Normalzustand:
preg_match('/D.*r/', $string, $matches);
-> Dieser Satz wird fast gefr

// Einen Quantifier ungreedy gemacht:
preg_match('/D.*?r/', $string, $matches);
-> Dieser

// Greediness aller Quantifier umgeschaltet:
preg_match('/D.*r/U', $string, $matches);
-> Dieser

// Doppelt gemoppelt: Greediness umgeschaltet,
// einen Quantifier wieder zurückgeschaltet:
preg_match('/D.*?r/U', $string, $matches);
-> Dieser Satz wird fast gefr

// Bei dieser Schreibweise spielt die Greediness keine Rolle:
preg_match('/D[^r]*r/', $string, $matches);
-> Dieser

Die ereg()-Funktionen kennen übrigens keine umschaltbare Gierigkeit (d.h. Quantifier sind immer gierig).

Valid HTML 4.01! Valid CSS!

8.13. Hilfe, mein Regulärer Ausdruck frißt zuviel!
http://www.php-faq.de/q/q-regexp-gierig.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team