W3docs

PHP Reguläre Ausdrücke

Lernen Sie, wie reguläre Ausdrücke in PHP funktionieren: Muster, preg_-Funktionen, Validierung und Textersetzung.

Ein regulärer Ausdruck (Regex) ist ein Muster, das eine Menge von Zeichenketten beschreibt. Anstatt nach einem festen Textstück zu suchen, beschreibt man die Form — „eine E-Mail-Adresse", „eine Folge von Ziffern", „ein Wort, das auf .php endet" — und PHP findet, validiert, ersetzt oder teilt Text, der passt.

Dieses Kapitel erklärt, wie PHPs preg_-Funktionen funktionieren, die Syntax eines Musters (Begrenzer, Zeichenklassen, Quantifizierer, Gruppen, Anker) sowie die häufigsten praktischen Aufgaben: Eingaben validieren, Daten extrahieren und Text ersetzen.

Was sind reguläre Ausdrücke

Ein regulärer Ausdruck ist eine Folge von Zeichen, die ein Suchmuster definiert. Die meisten Zeichen stimmen mit sich selbst überein — das Muster cat passt auf den wörtlichen Text cat. Die Stärke liegt in Metazeichen, die für Kategorien von Zeichen oder Wiederholungen stehen:

TokenBedeutungBeispiel-Treffer
.Beliebiges einzelnes Zeichen (außer Zeilenumbruch)c.tcat, cut
\dEine Ziffer 0-9\d\d42
\wEin „Wort"-Zeichen (a-z, A-Z, 0-9, _)\w+hello_1
\sLeerzeichen (Space, Tab, Zeilenumbruch)
[abc]Eines von a, b, c[aeiou]e
[^abc]Beliebiges Zeichen außer a, b, c
a*Null oder mehr a"", aaa
a+Ein oder mehr aa, aaa
a?Null oder ein a (optional)"", a
a{2,4}Zwischen 2 und 4 mal aaa, aaaa
^ / $Anfang / Ende der Zeichenkette
|Alternation („oder")cat|dogcat oder dog
()Gruppierung / Erfassung(ab)+abab

Wie reguläre Ausdrücke in PHP funktionieren

PHP verwendet PCRE (Perl-Compatible Regular Expressions) über die preg_-Funktionsfamilie. Die am häufigsten genutzten:

FunktionWas sie tut
preg_match()Prüft, ob ein Muster passt; erfasst den ersten Treffer
preg_match_all()Findet alle Treffer in einer Zeichenkette
preg_replace()Ersetzt jeden Treffer durch neuen Text
preg_split()Teilt eine Zeichenkette anhand eines Musters
preg_quote()Maskiert Regex-Metazeichen in einer wörtlichen Zeichenkette

Die Syntax eines PHP-Musters

Ein PHP-Muster ist eine Zeichenkette aus drei Teilen: einem Begrenzer, dem Muster und optionalen Modifikatoren.

/pattern/modifiers

Das erste Zeichen ist der Begrenzer — meistens /, aber jedes nicht-alphanumerische Zeichen funktioniert (#, ~, !). Ein Begrenzer zu wählen, der nicht im Muster vorkommt, erspart das Maskieren. Das Abgleichen eines URL-Pfads ist zum Beispiel mit # übersichtlicher:

"#^/users/\d+$#"   // no need to escape the slashes

modifiers sind optionale Buchstaben nach dem schließenden Begrenzer, die das Verhalten der Engine ändern:

  • iinsensitiv (Groß-/Kleinschreibung ignorieren): /php/i passt auf PHP, Php, php.
  • mmehrere Zeilen: ^ und $ passen am Anfang/Ende jeder Zeile, nicht nur der ganzen Zeichenkette.
  • ssingle line („dotall"): . passt auch auf Zeilenumbrüche.
  • u — Muster und Eingabe als UTF-8 behandeln. Verwenden Sie dies für Text mit Nicht-ASCII-Zeichen.
  • x — erweitert: Leerzeichen im Muster werden ignoriert, sodass man komplexe Muster aufteilen und kommentieren kann.

Auf einen Treffer prüfen mit preg_match

preg_match() gibt 1 zurück, wenn das Muster gefunden wird, 0 wenn nicht und false bei einem Fehler. Es ist die richtige Wahl für eine Ja/Nein-Frage wie „enthält diese Zeichenkette eine Ziffer?"

php— editable, runs on the server

Das optionale dritte Argument, $matches, wird mit den Ergebnissen gefüllt: $matches[0] ist der gesamte Treffer, und $matches[1], $matches[2], … sind die Erfassungsgruppen in der Reihenfolge — die von jedem Klammernpaar erfassten Teilzeichenketten.

Benutzereingaben validieren

Eine häufige Anwendung von Regex ist die Validierung von Benutzereingaben — zu prüfen, ob ein Wert die richtige Form hat, bevor man es speichert oder vertraut. Hier ist eine einfache E-Mail-Prüfung:

<?php

$email = "[email protected]";

if (preg_match("/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/", $email)) {
    echo "Valid email address";
} else {
    echo "Invalid email address";
}

?>

Die Anker ^ und $ sind hier wichtig: Ohne sie würde das Muster eine E-Mail-Adresse irgendwo innerhalb einer längeren Zeichenkette finden, sodass "junk [email protected] junk" bestehen würde. Mit ihnen muss die gesamte Zeichenkette eine einzelne E-Mail sein.

Speziell für E-Mails ist PHPs eingebautes filter_var() mit FILTER_VALIDATE_EMAIL robuster als ein handgeschriebener Regex. Verwenden Sie Regex, wenn Sie ein Format benötigen, das die Filter nicht abdecken — Postleitzahlen, benutzerdefinierte IDs, Telefonnummern. Unter PHP Formularvalidierung finden Sie ein vollständiges Beispiel zur Eingabeprüfung.

Alle Treffer finden mit preg_match_all

Während preg_match() beim ersten Treffer stoppt, sammelt preg_match_all() alle — nützlich zum Extrahieren aller Hashtags, Preise oder Links aus einem Textblock.

<?php

$text = "Prices: $12, $7 and $349";

preg_match_all("/\\\$(\d+)/", $text, $matches);

print_r($matches[1]); // the captured numbers

?>

$matches[1] enthält ein Array aller erfassten Gruppen — hier ["12", "7", "349"].

Text ersetzen mit preg_replace

preg_replace() ersetzt jeden Treffer. Im Ersatzstring beziehen sich $1, $2, … auf erfasste Gruppen, sodass man Text umschreiben und nicht nur entfernen kann:

<?php

$date = "2026-06-21";

// Reformat YYYY-MM-DD into DD/MM/YYYY
echo preg_replace("/(\d{4})-(\d{2})-(\d{2})/", "$3/$2/$1", $date);
// 21/06/2026

?>

Um eine Zeichenkette anhand eines Musters in Teile zu zerlegen statt zu ersetzen, verwenden Sie preg_split() — zum Beispiel zum Aufteilen bei beliebigen Leerzeichen mit /\s+/.

Fortgeschrittene Techniken

Sobald Sie mit den Grundlagen vertraut sind, helfen diese Funktionen bei schwierigeren Mustern:

  • Erfassungsgruppen (...) — bestimmte Teile eines Treffers extrahieren, wie oben mit $matches[1] gezeigt.
  • Nicht-erfassende Gruppen (?:...) — gruppieren, ohne einen $matches-Slot zu belegen, wenn die Gruppierung nur für einen Quantifizierer oder eine Alternation benötigt wird.
  • Benannte Gruppen (?<year>\d{4}) — einen Treffer nach Name referenzieren ($matches['year']) statt nach Nummer.
  • Lookahead (?=...) und Lookbehind (?<=...) — basierend auf dem, was danach oder davor kommt, abgleichen, ohne es zu verbrauchen. Nützlich für „eine Zahl gefolgt von px" ohne px zu erfassen.
  • Träge Quantifizierer *?, +? — so wenige Zeichen wie möglich erfassen. Standardmäßig ist .* gierig und greift alles, was es kann.

Ein Hinweis zum Maskieren: Zeichen wie ., +, *, ?, (, ), [, \ haben eine besondere Bedeutung. Um sie wörtlich zu matchen, stellen Sie einen Backslash voran (\. entspricht einem wörtlichen Punkt). Wenn der wörtliche Text aus einer Variable stammt, verwenden Sie preg_quote(), um ihn sicher zu maskieren.

Häufige Stolpersteine

  • Begrenzer vergessen. PHP-Muster sind Zeichenketten und müssen Begrenzer enthalten: "/\d+/", nicht "\d+". Das Weglassen löst eine Warnung aus und der Abgleich schlägt fehl.
  • Doppeltes Maskieren in doppelt angeführten Zeichenketten. Innerhalb von "..." ist ein Backslash auch ein PHP-Escape. "/\d/" funktioniert, weil \d kein PHP-Escape ist, aber um ein wörtliches $ zu matchen, benötigt man "/\\$/". Einfach angeführte Zeichenketten ('/\d/') vermeiden diese Überraschung.
  • Gieriges Matching erfasst zu viel. <.*> auf <a><b> passt auf das gesamte <a><b>, nicht nur auf <a>. Verwenden Sie ein träges <.*?> oder eine negierte Klasse <[^>]*>.
  • Den u-Modifikator bei UTF-8 vergessen. Ohne /u arbeiten . und \w auf Bytes und verstümmeln Mehrbyte-Zeichen.

Fazit

Reguläre Ausdrücke ermöglichen es, die Form von Text statt seines genauen Inhalts zu beschreiben, was sie unverzichtbar für die Validierung von Eingaben, das Extrahieren von Daten und das Transformieren von Zeichenketten macht. In PHP greift man über die preg_-Funktionen darauf zu: preg_match() und preg_match_all() zum Suchen, preg_replace() zum Umschreiben und preg_split() zum Aufteilen von Zeichenketten. Beginnen Sie mit Ankern, Zeichenklassen und Quantifizierern, und fügen Sie dann Gruppen und Lookarounds hinzu, wenn Ihre Muster komplexer werden. Für einen tieferen Einstieg in die Zeichenketten, mit denen Sie arbeiten, lesen Sie PHP Strings.

Übungen

Übung
Was ist der Hauptzweck von PHP-Regex?
Was ist der Hauptzweck von PHP-Regex?
Was this page helpful?