dclp FAQ

FAQ der Newsgroups de.comp.lang.php.*

 
  • Increase font size
  • Default font size
  • Decrease font size

Reguläre Ausdrücke

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

E-MailDruckenPDFLesezeichen anlegen: Du musst dich einloggen um ein Lesezeichen für diesen Beitrag anzulegen. Es wird deiner persönlichen Lesezeichenliste hinzugefügt.

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).

Hilfe, mein Regulärer Ausdruck frißt zuviel!
http://www.php-faq.de/q-regexp-gierig.html
 

Login