Eine Übereinstimmung finden - preg_match()

Diese Funktion durchsucht einen Text nach einer Übereinstimmung mit einem Suchmuster. Die Syntax lautet: int preg_match (string Suchmuster, string Zeichenkette [, array &Treffer [, int Flags [, int Versatz]]])

Die Funktion erwartet mindestens zwei Parameter, optional können noch drei weitere angegeben werden.

Suchmuster
Der Reguläre Ausdruck samt Delimiter und Modifier
Zeichenkette
Der Text, der durchsucht werden soll
Treffer
Optionaler Parameter, liefert die gefundenen Treffer und Unterausdrücke
Flags
Optional, erlaubt die Übergabe bestimmter Parameter
Versatz
Optional, die Stelle, ab der gesucht werden soll

Als Rückgabewert der Funktion erhält man die Anzahl der Übereinstimmungen des Suchmusters mit dem Text. Die ist entweder 0, wenn nichts gefunden wurde, oder 1 - da preg_match() nach dem ersten Treffer nicht weitersucht - wenn etwas gefunden wurde. Wenn ein Fehler auftrat, wird FALSE zurückgegeben.

Mit preg_match lässt sich unter anderem überprüfen, ob ein Text bestimmten Kriterien entspricht. So könnte man hiermit <?PHP if (preg_match('#^[a-z]+$#i''Dies ist der Test')) echo 'Nur Buchstaben!'; else echo 'Nicht nur Buchstaben!'; ?> prüfen, ob eine Zeichenkette ausschließlich Buchstaben von a-z beziehungsweise A-Z enthält. Erklärungen zu der verwendeten Zeichenklasse, den Metazeichen und den Quantifier und Modifiern finden sich in den jeweiligen Abschnitten des Tutorials.

Die Rückgabe von preg_match

Wird bei der Verwendung von preg_match() ein dritter Parameter angegeben, so stehen in ihm nach der Abarbeitung die gefundene Zeichenkette und die enthaltenen Unterausdrücke als Array zur Verfügung. Im ersten Element (Index 0) findet sich der dabei gesamte Treffer, in den weiteren Elementen die gefundenen Unterausdrücke. Die Nummerierung entspricht der normalen Nummerierung von Unterausdrücken.

Im folgenden Beispiel wird ein einfacher String, der zur Anmeldung an einer Datenbank verwendet werden kann, auf Gültigkeit überprüft. Gleichzeitigt werden die einzelnen Teile zurückgegeben und können weiterverwendet werden. <?PHP if (preg_match ('#(.+):(.*)@(.+)/(.+)#''root:rootie@localhost/pcre'$rueckgabe)) echo '<pre>'.print_r($rueckgabeTRUE).'</pre>'; else echo 'Unpassendes Format!'; ?> Der Code führt zu folgender Ausgabe (die Kommentare wurden ergänzt): Array ( [0] => root:rootie@localhost/pcre // die gesamte gefundene Textstelle [1] => root // erster Unterausdruck [2] => rootie // zweiter Unterausdruck [3] => localhost // dritter Unterausdruck [4] => pcre // vierter Unterausdruck ) preg_match() eignet sich somit einerseits zum Prüfen einer Zeichenkette als auch andererseits zum direkten Weiterverarbeiten der gefundenen Treffer.

Weitere optionale Parameter

Neben den zwei anzugebenden Parametern können an preg_match() noch drei weitere übergeben werden, die das Verhalten der Funktion zusätzlich beeinflussen. Auf den ersten optionalen Parameter wurde im vorherigen Abschnitt schon eingegangen, nachfolgenden werden noch die zwei anderen erläutert.

Die Flags von preg_match()

Durch Angabe bestimmter Flags kann das Verhalten von preg_match() beeinflusst werden. Die Funktion preg_match() besitzt genau ein Flag, welches verwendet werden kann.

PREG_OFFSET_CAPTURE

Durch Angabe des Flags PREG_OFFSET_CAPTURE werden zusätzlich zu den gefundenen Treffern noch die jeweiligen Positionen im Suchtext, an denen die Treffer auftreten, zurückgegeben. Man erhält als Array-Elemente der Rückgabe nun keine Zeichenketten, sondern wiederum Arrays, die den Treffer und die Position als Elemente tragen.

Wenn wir wieder unser Beispiel von oben verwendet, diesmal allerdings ergänzt um die Angabe von PREG_OFFSET_CAPTURE, <?PHP if (preg_match ('#(.+):(.*)@(.+)/(.+)#''root:rootie@localhost/pcre'$rueckgabePREG_OFFSET_CAPTURE)) echo '<pre>'.print_r($rueckgabeTRUE).'</pre>'; else echo 'Unpassendes Format!'; ?> erhalten wir als Rückgabe ein zwei-dimensionales Array, welches zusätzlich noch die Position der Treffer enthält. Array ( [0] => Array // gesamter Treffer ( [0] => root:rootie@localhost/pcre // Inhalt [1] => 0 // Position des Auftretens ) [1] => Array // erster Unterausdruck ( [0] => root // Inhalt [1] => 0 // Position des Auftretens ) [2] => Array // zweiter Unterausdruck ( [0] => rootie // Inhalt [1] => 5 // Position des Auftretens ) [3] => Array // dritter Unterausdruck ( [0] => localhost // Inhalt [1] => 12 // Position des Auftretens ) [4] => Array // vierter Unterausdruck ( [0] => pcre // Inhalt [1] => 22 // Position des Auftretens ) ) Sollen mehrere gleichartige Datenstrukturen extrahiert werden, sollte man das im nächsten Abschnitt behandelte preg_match_all() verwenden. Dieses liefert alle gefundenen Treffer.

Der Parameter Versatz

Normalerweise beginnt PHP am Anfang der zu durchsuchenden Zeichenkette mit dem Suchen nach Übereinstimmungen. Über den optionalen Parameter Versatz kann aber auch eine andere Stelle definiert werden, ab der gesucht wird. Der Parameter steht seit der PHP-Version 4.3.3 zur Verfügung (und wird deshalb beim RegExp-Evaluator noch nicht eingesetzt).

Will man diesen Parameter angeben, aber keine Flags definieren, muss man an der Stelle des Parameters Flags den Wert -1 notieren, so wie im folgenden Beispiel gezeigt wird. <?PHP preg_match($pattern$subject$sub, -1$versatz); ?> Dies gilt übrigens für alle preg-Funktionen, bei denen hinter den Flags noch Parameter angegeben werden sollen.

Verwandte Themen
Kapitelnavigation