In PHP ist es möglich, einen String mit Hilfe von regulären Ausdrücken zu durchsuchen. Ein regulärer Ausdruck wird dann benötigt, wenn man nicht nach einer festen Zeichenkette sucht, sondern nur eine bestimmte Vorgabe hat, wie z.B. nur Zahlen oder eine Zahl am Anfang und neuen Buchstaben danach. Ein regulärer Ausdruck dient sozusagen als Filterkriterium.

Um solche Suchausdrücke zu erstellen, benötigt man eine Syntax. PHP verwendet die dieselbe Syntax wie Perl.

Es gibt Metazeichen, die eine festgelegte Bedeutung haben und nicht direkt als Suchausdruck verwendet werden können. Möchte man eines dieser Metazeichen verwenden, so muss man dieses mit einem Backslash (\) „escapen“. Zu den Metazeichen gehören: [, ], (, ), {, }, |, ?, +, *, ^, $, \ und ..

Die Klammern [ und ] können verwendet werden, um eine Menge von Zeichen zu definieren. Zum Beispiel ist [5-9] der Ausdruck für alle Zahlen zwischen 5 und 9.

Des Weiteren gibt es noch eine Anzahl an vordefinierten Ausdrücken:

[:alnum:]Alle alphanumerischen Zeichen. Dieser Ausdruck beinhaltet [:alpha:] und [:digit:].
[:alpha:]Alle Buchstaben. Dieser Ausdruck beinhaltet [:lower:] und [:upper:].
[:blank:]Leerzeichen und Tabulator
[:alnum:]Alle alphanumerischen Zeichen. Dieser Ausdruck beinhaltet [:alpha:] und [:digit:].
[:cntrl:]Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F, und 7F (DEL).
[:digit:]Alle Ziffern von 0 bis 9.
[:graph:]Graphische Zeichen. Dieser Ausdruck enthält [:alnum:] und [:punct:]
[:lower:]Kleinbuchstaben. Welche Zeichen zu den Kleinbuchstaben gehören, ist von der Servereinstellung abhängig.
[:print:]Druckbare Zeichen. Dieser Ausdruck enthält [:alnum:], [:punct:] und Leerzeichen.
[:punct:]Dieser Ausdruck enhält zeichen wie ! “ # $ % & ‚ ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .
[:space:]Whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen.
[:upper:]Großbuchstaben. Welche Zeichen zu den Großbuchstaben gehören, ist von der Servereinstellung abhängig.
[:xdigit:]Enthält alle Zeichen, die bei einer hexadezimalen Schreibweise benötigt werden.
\dEine Ziffer aus dem Bereich 0 bis 9. Auch als [0-9] schreibbar.
\DKeine Ziffer. Auch als [^0-9] schreibbar.
\wEin Buchstabe, eine Ziffer oder der Unterstrich. Auch als [a-zA-Z_0-9] schreibbar
\Wkein Buchstabe, keine Zahl und kein Unterstrich. Auch als [^a-zA-Z_0-9] schreibbar
\sWhitespace, meistens [ \f\n\r\t\v]
\SAlle Zeichen aus den Whitespaces.

Die oben genannten Befehle gelten immer nur für ein Zeichen. Möchte man mehrere Zeichen der gleichen Sorte erlauben, braucht man einen sogenannten Quantifizierer. Diese Quantifizierer sehen wie folgt aus:

?Der voranstehende Ausdruck darf einmal oder gar nicht auftauchen. Man kann auch schreiben.
+Der voranstehende Ausdruck muss mindestens einmal auftauchen.Er kann aber auch beliebig oft auftauchen. Man kann a uch schreiben.
*Der voranstehende Ausdruck kann gar nicht oder beliebig oft auftauchen. Man kann auch schreiben.
{n}Der voranstehende Ausdruck muss exakt n-mal auftauchen.
{n,}Der voranstehende Ausdruck muss mindesten n-mal auftauchen.
{,m}Der voranstehende Audruck darf maximal m-mal auftauchen.
{n,m}Der voranstehende Ausdruck muss mindestens n-mal und maximal m-mal auftauchen

Lookahead

Bei einem Lookahead wird nach einer normalen Zeichenkette gesucht und zusätzlich dazu, muss eine weitere Zeichenkette nach der ersten Zeichekette übereinstimmen, damit es einen Treffer gibt. Es wird zwischen dem positiven Lookahead und dem negativen Lookahead unterschieden.

Anwendungsbeispiel für einen negativen Lookahead:

preg_replace('/&(?!amp;)/', '&amp;', $_SERVER['REQUEST_URI']);

Bei dem oben genannten Suchmuster wird nach & gesucht auf das kein amp; folgt. Wurde ein Treffer gefunden, dann wird das & durch ein &amp; ersetzt. Der Sinn dahinter ist, dass in der Variablen $_SERVER[‚REQUEST_URI‘] & auftauchen können, die nicht valide ausgegeben werden. Es dürfen aber keine möglicherweise vorhandenen & umgewandelt werden. Dies verhindert der negative Lookahead (?!Suchmuster)

Anwendungsbeispiel für einen positiven Lookahead:

$var = 'Ich bin ein Text, der Euro- und Dollar-Beträge einthält wie zum Beispiel 15,12 EUR und 89,34 USD. Oder auch 12 EUR und 45 USD. Und noch einer 6677.';

preg_match_all('/\d+(,\d\d)?(?= EUR)/', $var, $ergebnis);

In der Variablen $ergebnis werden jetzt alle Zahlen gespeichert, auf die die Zeichenkette “ EUR“ folgt. So kann man sehr leicht die nötigen Informationen aus einem String herausziehen, ohne dass man unerwünschte Treffer, in dem Beispiel wären das die Dollar-Beträge und Zahlen ohne Währungsangabe, erhält. Der positive Lookahead sieht wie folgt aus: (?=Suchmuster).

Lookbehind

Das Gegenteil zum Lookahead ist der Lookbehind. Hier wird vor dem eigentlichen Suchmuster nach einem weiteren Suchmuster gesucht. Wenn dies der Fall ist, dann gibt es einen Treffer. Auch hier gibt es den postiven (?<=Suchmuster) und negativen (?<!Suchmuster) Lookbehind. Da die Funktionsweise die gleiche wie beim Lookahead ist, spare ich mir an dieser Stelle die Beispiele.