Reguläre Ausdrücke

Ein regulärer Ausdruck ist ein Muster zum Vergleichen und Verarbeiten von Strings.

Hauptsächlich werden reguläre Ausdrücke zum Validieren und suchen innerhalb von Strings verwendet, wenn die einfachen Prüfungen auf Gleichheit nicht mehr ausreichen.


Grundlagen

Reguläre Ausdrücke verwenden bestimmte Regeln und Metazeichen, um bestimmte Muster darzustellen. Damit können wir einzelne Bereiche oder ganze Strings erkennen.

Die wichtigsten Informationen zusammengefasst

Ziffern und Buchstaben entsprechen sich selbst.

Zeichen steht für sich selbst

a

Reguläre Ausdrücke verwenden besondere Zeichen, die auch als "Steuerzeichen" oder "Metazeichen" bekannt sind.

Zeichen mit besonderer Bedeutung

\|[]{}()^$*+-.?

Wenn eines der Zeichen Bestandteil des Musters ist, dann muss es "maskiert" bzw. "entwertet" werden.

Backslash entwertet

\\ 

"^" steht für den Anfang des Musters, das Ende wird mit "$" bezeichnet.

Beginn und Ende des Ausdruckes

^$
  • "\b" liefert true wenn Anfang oder Ende eines Wortes erreicht ist. Wortgrenze erreicht.
  • "\B" liefert true wenn nicht der Anfang oder das Ende eines Wortes erreicht ist. Keine Wortgrenze.
  • Zeichengruppen werden mit "[ ]" gekennzeichnet.
  • "[ADN]" erkennt das Muster, wenn A, D oder N vorkommen.
  • "[a-n]" bezeichnet alle Kleinbuchstaben von a bis n.
  • "[a-zA-Z0-9]" bezeichnet alle Kleinbuchstaben, alle Großbuchstaben und alle Ziffern.
  • Der Punkt "." steht für jedes beliebige Zeichen.
  • Zeichenklassen stehen für bestimmte Zeichenarten: "\w" steht für Wort, "\d" steht für alle Ziffern und "\s" steht für Whitespace (Leerzeichen, Tabs, Zeilenumbrüche usw.).
  • Um Zeichenklassen auszuschließen verwenden wir dessen Großschreibform: "\W" schließt alle Wörter aus, "\D" schließt alle Ziffern aus und "\S" schließt gesamten Whitespace aus.
  • Um bestimmte Zeichen auszuschließen, verwenden wir das "^"-Symbol. "[^ADN]" schließt die Zeichen A, D und N aus.

Die Häufigkeit der Zeichen geben wir mit geschweiften Klammern an. "\d{5}" steht für 5 beliebige Ziffern. Wenn wir jetzt noch Anfang und Ende bestimmen, haben wir den fertigen regulären Ausdruck, um die deutschen Postleitzahlen zu überprüfen: "^\d{5}$"

Wollen wir nun eines der Zeichen mit ausgeben lassen, so müssen wir es vorher entwerten, weil es sonst als Datumselement gewertet wird.

Innerhalb der geschweiften Klammern können wir auch das minimale und maximale Auftreten der Zeichen festlegen. "\d{2,4}" bezeichnet 2 bis 4 vorkommen vom Typ Ziffer. Wenn einer der beiden Minimal- oder Maximalwerte weggelassen werden, beschreibt das die Werte für mindestens und höchstens. "\d{,8}" steht für höchstens 8 Ziffern.

Für die Häufigkeit gibt es noch ein paar Kurzformen.

  • "?" steht für kein oder einmaliges Auftreten. Entspricht: "{0,1}"
  • "+" steht für einmaliges oder mehrmaliges Auftreten. Entspricht: "{1,}"
  • "*" steht für beliebig oft. Entspricht: "{0,}"

Mit Klammern können wir Elemente zusammenfassen. Das bietet sich an, wenn wir mehrere Alternativen haben. "(com|org)|\w{2}", dieses Muster liefert true bei com, org und allem aus 2 Buchstaben. Der Inhalt von Klammern kann an anderer Stelle des Ausdrucks wieder aufgerufen werden. "\Nummer der Klammer", "(\1, \2 usw.)".


Funktionen für reguläre Ausdrücke

Die Funktion "preg_match" lässt uns den regulären Ausdruck einfach auf einem String anwenden. Dafür übergeben wir als ersten Parameter den regulären Ausdruck und als zweiten Parameter den String, auf dem wir den Ausdruck prüfen wollen. Der gesamte reguläre Ausdruck muss in 2 identisch einfachen Symbolen stehen. Der Standard ist der Schrägstrich /, alternativ können auch die Klammern verwendet werden().

Ausdruck gegen Zeichenkette prüfen

$string = "abcdefghijklmnopqrstuvwxyz";
$reg = "/mno/";
echo preg_match($reg, $string);

Der Rückgabewert der Funktion ist 1, wenn der reguläre Ausdruck gefunden wurde. Sollte der reguläre Ausdruck nicht zutreffen, wird 0 zurückgegeben.

Hinweis

0 ist nicht gleich 0. Der Rückgabewert 0 bei nicht zutreffen, ist vom Typ String. Der Rückgabewert 0 als boolescher Wert (false) wird zurückgegeben, wenn ein Fehler auftritt. Um den Typ zu Überprüfen, bietet sich die strikte Gleichheit an (0===0).

Ein etwas komplexeres Beispiel lässt uns Überprüfen, ob die Benutzereingabe ein gültiges Datum im deutschen Format des aktuellen und des letzten Jahrhunderts ist. Der Ausdruck berücksichtigt sogar die Eingabe des Tages und des Monats als nur eine Zahl sowie das Jahr als 2 bzw. 4 Zahlen.

Ausdruck gegen Zeichenkette prüfen

$string = "7.04.15";
$reg = "/^(0?[1-9]|[12]\d|3[01]).(0?[1-9]|1[0-2]).((19|20)?\d{2})$/";
echo preg_match($reg, $string);

Die Funktion "preg_match" kann als dritten Parameter eine Variable entgegen nehmen, in der die Einzelteile des Strings als Array gespeichert werden.

Einzelne Bestandteile ausgeben lassen

if (preg_match($reg, $string, $einzelteile)) {
 echo $einzelteile[0];
}

Die Variable "$einzelteile" enthält nun ein Array, in dem die einzelnen Teile des Strings gespeichert sind. Der Index 0 entspricht dem gesamten String. Der Index 1,2 oder 3 enthalten die jeweiligen Werte, die innerhalb der runden Klammern stehen.

Einzelne Bestandteile ausgeben lassen

if (preg_match($reg, $string, $einzelteile)) {
 echo $einzelteile[1] . "-" . $einzelteile[2] . "-" . $einzelteile[3];
}

Weitere Funktionen

Funktion Beschreibung
preg_split Teilt einen String am angegebenen Trennzeichen
preg_replace Ersetzt das Muster mit dem Ersatz
preg_replace_callback Mit Funktionsaufruf
preg_grep Sucht regulären Ausdruck innerhalb von Arrays
preg_quote Entwertet die Musterzeichend es regulären Ausdrucks

Postleitzahlen

Eine deutsche Postleitzahl besteht immer aus 5 Zahlen.

Ausdruck für 5 Ziffern

$reg = "/^\d{5}$/";

Erweitern können wir das Beispiel, indem wir optional die Länderkennung mit dem Bindestrich berücksichtigen.

Ausdruck für 5 Ziffern mit optionalen Buchstaben

$reg = "/^(\w-)?(\d{5})$/";

Die Klammern geben uns die Möglichkeit, auf den einzelnen Teilen der Postleitzahl zuzugreifen.

Ausdruck gegen Postleitzahlencode prüfen

$plz = "D-10115";
$reg = "/^(\w-)?(\d{5})$/";
if (preg_match($reg, $plz, $einzelteile)) {
 echo "Länderkennung: " . $einzelteile[1] . "<br /> Postleitzahl: " . $einzelteile[2];
}

Telefonnummern

Es gibt viele gültige Schreibweisen für Telefon oder Faxnummern. 0049 (99) 9999999 sowie 099-9999999 oder 089/999.999 sind alle gültige Telefonnummern. Für eine sinnvolle Überprüfung in Webformularen empfiehlt es sich, alle möglichen Trennzeichen zuzulassen, aber auch eine einzelne Angabe von Länderkennung, Vorwahl und Telefonnummer durchzuführen.


Weiter mit objektorientierte Programmierung