Menu

PHP preg_match(): reguläre Ausdrücke mit Beispielen

preg_match($pattern, $subject, $matches) prüft einen String gegen einen regulären Ausdruck und liefert 1 bei einem Treffer, 0 bei keinem. Hier: Capture Groups, benannte Gruppen, preg_match_all, Anker, Muster zur Validierung und der Modifikator u für UTF-8 und japanischen Text.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

preg_match($pattern, $subject, $matches) prüft, ob ein String zu einem regulären Ausdruck passt. Es liefert 1 bei einem Treffer und sonst 0 und füllt $matches mit dem Gefundenen: preg_match('/\d+/', 'Order 4521 shipped', $m) liefert 1 und setzt $m[0] auf "4521".

Das Muster ist ein String mit Begrenzern darum, meist /.../, gefolgt von Modifikatoren wie i. Schreib Muster in einfache Anführungszeichen: In doppelten erweitert PHP zuerst $name und Escapes wie \x41 oder \101, sodass die Regex-Engine ein anderes Muster bekommen kann als das, was du getippt hast.

Capture Groups

Klammern in einem Muster fangen den Teil des Strings ein, den sie treffen. $m[0] ist der ganze Treffer, $m[1] die erste Gruppe, $m[2] die zweite, gezählt nach öffnender Klammer von links.

Benannte Gruppen

(?<name>...) gibt einer Gruppe einen Namen. Der Wert wird unter dem Namen und unter seiner Nummer gespeichert, sodass Code, der das Ergebnis liest, nicht kaputtgeht, wenn jemand weiter vorne im Muster eine Gruppe hinzufügt.

Jeden Treffer mit preg_match_all finden

preg_match_all() sucht nach dem ersten Treffer weiter und liefert die Anzahl der Treffer. Standardmäßig enthält $m[0] alle vollständigen Treffer und $m[1] alle Werte der ersten Gruppe. Mit PREG_SET_ORDER bekommst du stattdessen ein Array pro Treffer, über das sich leichter iterieren lässt.

Eingaben prüfen: Anker, Telefonnummern, Postleitzahlen

Zur Validierung muss das Muster den ganzen String treffen, also beginnt es mit ^ und endet mit $. Eine Falle: $ passt auch vor einem abschließenden Zeilenumbruch, also akzeptiert '/^\d+$/' den String "123\n". Füge den Modifikator D hinzu oder verwende \z, das nur ganz am Ende passt.

Bei E-Mail-Adressen lehnt ein regulärer Ausdruck entweder gültige Adressen ab oder akzeptiert ungültige. Verwende stattdessen filter_var($email, FILTER_VALIDATE_EMAIL) (siehe filter_var()).

Der Modifikator u für UTF-8 und japanischen Text

Ohne den Modifikator u arbeitet ein Muster auf Bytes. Ein japanisches Zeichen hat in UTF-8 drei Bytes, also trifft . ein Drittel eines Zeichens, und Längen stimmen nicht. Mit u arbeitet das Muster auf Zeichen, und du kannst Unicode-Eigenschaftsklassen verwenden.

u validiert außerdem den String: Ist er kein gültiges UTF-8, liefert preg_match() false, statt zu treffen.

Nutzereingaben mit preg_quote escapen

Zeichen wie ., +, ?, ( und / haben in einem Muster eine besondere Bedeutung. Wenn ein Teil des Musters aus einer Variable kommt, etwa ein Suchbegriff, schick ihn durch preg_quote() mit dem Begrenzer als zweitem Argument, sonst trifft 1+1 auf 11, und ein nicht escaptes / macht das Muster kaputt.

Ein ungültiges Muster wirft keine Exception. PHP gibt eine Warnung aus, und preg_match() liefert false:

Warning: preg_match(): No ending delimiter '/' found in /path/to/index.php on line 3

Prüfe also auf === false (oder preg_last_error_msg()), wenn das Muster zur Laufzeit gebaut wird. Für eine einfache Prüfung auf einen Teilstring ganz ohne Muster ist str_contains() schneller und klarer. Um den getroffenen Text zu ändern, verwendest du preg_replace().

Häufig gestellte Fragen

Was liefert preg_match in PHP?

1, wenn das Muster passt, 0, wenn nicht, und false, wenn das Muster selbst ungültig ist. Weil 0 und false beide falsy sind, vergleichst du mit === 1, wenn du ein fehlerhaftes Muster von keinem Treffer unterscheiden musst.

Wie bekomme ich den gefundenen Text aus preg_match?

Übergib ein drittes Argument: preg_match('/(\d+)/', 'Order 4521', $m). Dann ist $m[0] der ganze Treffer und $m[1] die erste Capture Group, hier beide "4521". Mit einer benannten Gruppe (?<id>\d+) steht der Wert auch in $m['id'].

Was ist der Unterschied zwischen preg_match und preg_match_all?

preg_match() hört beim ersten Treffer auf. preg_match_all() findet jeden Treffer, liefert ihre Anzahl und füllt $matches mit allen: preg_match_all('/\d+/', 'a1 b22 c333', $m) liefert 3, und $m[0] ist ["1", "22", "333"].

Wie verwende ich preg_match mit japanischem oder anderem UTF-8-Text?

Füge den Modifikator u hinzu: preg_match('/^.{3}$/u', '日本語') liefert 1. Ohne u behandelt PHP den String als Bytes, also trifft . ein Byte eines 3-Byte-Zeichens. Mit u kannst du außerdem Unicode-Klassen wie \p{Han}, \p{Hiragana} und \p{Katakana} verwenden.

Wie prüfe ich in PHP, ob ein String nur Ziffern enthält?

Mit preg_match('/^\d+$/D', $s) oder, ohne Regex, ctype_digit($s). Der Modifikator D (oder \z statt $) ist wichtig: Ein einfaches $ akzeptiert auch einen Zeilenumbruch am Ende, also würde "123\n" durchgehen.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S