In diesem Tutorial Versuche ich ihnen zu erklären wie sie mit der PHP Funktion preg_match() eine Variable überprüfen anhand eines Suchmusters.
Reguläre Ausdrücke sind das Schweizer Taschenmesser der Textverarbeitung und ermöglichen die Anwendung komplexer patterns. Mit einem einzigen, kompakt notierten Muster kann man prüfen, ob eine Zeichenkette bestimmten Regeln folgt, Teile aus ihr herausfiltern oder vorhandene Werte validieren. In PHP übernimmt die Funktion preg_match() diese Aufgabe, indem sie – vereinfacht gesagt – fragt: „Passt diese Zeichenkette zu diesem Muster?“
Warum sollte man dafür nicht einfach strpos() oder seit PHP 8 str_contains() verwenden? Weil jene Funktionen nur feststellen, ob ein ganz bestimmter Sub-String vorkommt. preg_match() ist deutlich flexibler: Es versteht Platzhalter, Alternativen, Mengenangaben und sogar benannte Gruppen. Kurzum: Sobald Ihre Bedingung mehr ist als eine reine 1-zu-1-Suche, ist ein regulärer Ausdruck in preg_match() das Mittel der Wahl.
Eine häufige Frage lautet außerdem: Wann reicht preg_match() und wann brauche ich preg_match_all()? Die Antwort ist einfach:
preg_match() genügt, wenn Sie nur wissen möchten, ob mindestens ein Treffer existiert, oder wenn Sie nur den ersten Treffer (und ggf. dessen Gruppen) benötigen.
preg_match_all() ist unverzichtbar, wenn Sie alle Vorkommen im Text extrahieren wollen.
1. Die Syntax von preg_match() verstehen
int preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
)
Parameter
Bedeutung
Hinweise
$pattern
Der reguläre Ausdruck, umschlossen von Delimitern (/.../).
Delimiter frei wählbar (/, #, ~ …), Modifikatoren wie i, m, u hinter dem letzten Delimiter.
Enthält kompletten Treffer [0], danach Gruppen [1], [2] …; bei benannten Gruppen zusätzlich assoziative Keys.
$flags
Verhalten steuern.
PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL u. a.
$offset
Startposition (in Byte‐Offsets).
Nützlich bei wiederholter Suche im selben String.
Der Rückgabewert ist 1 bei mindestens einem Treffer, 0 bei keinem Treffer und false bei einem Syntax-Fehler im Muster. Prüfen Sie deshalb immer strikt mit ===, was bei der Verwendung von regular expressions von Bedeutung ist. – sonst verwechseln Sie leicht „kein Treffer“ mit „Fehler“.
if (preg_match($pattern, $subject) === 1) {
// Treffer!
}
Fehlerdetails liefert preg_last_error() bzw. ab PHP 8.0 preg_last_error_msg().
2. Regex-Grundlagen in PHP
Bevor wir tief in Code-Beispiele eintauchen, werfen wir einen Kurzblick auf die wichtigsten Bausteine regulärer Ausdrücke:
Kategorie
Symbol(e)
Bedeutung
Start/Ende
^, $
Anfang bzw. Ende der gesamten Zeichenkette
Wildcard
.
Beliebiges Zeichen außer Zeilenumbruch
Zeichenklassen
[abc], [^abc], d, w, s …
„Ein Zeichen aus …“ (inkl. Negation, Ziffern, Wortzeichen, Leerraum etc.)
Quantifizierer
*, +, ?, {n}, {n,}, {n,m}
Gibt an, wie oft das vorherige Element vorkommen darf/muss
Gruppierung
( … )
Fasst mehrere Elemente zusammen, speichert zugleich die Treffer
Alternativen
A | B
Entweder A oder B
Benannte Gruppen
(?<name> … )
Erhöht Lesbarkeit, Rückgriff über $matches['name'] möglich
Modifier
i, m, s, u, x
Verändern das Verhalten des Musters (z. B. Case-Insensitive, Dot-All)
Greedy vs. Lazy *, +, {n,} sind standardmäßig „gierig“ und greifen sich so viel wie möglich. Hängen Sie ein ? an, werden sie „sparsam“ (lazy). Beispiel: .*? – das kleinste mögliche Stück bis zum nächsten passenden Zeichen.
Unicode Damit ä, € oder Emoji richtig als ein Codepoint erkannt werden, setzen Sie den u-Modifier: '/w+/u'. Sonst arbeitet PHP intern bytebasiert.
3. Rückgabewert richtig interpretieren
$result = preg_match($pattern, $subject, $matches, 0, $offset);
if ($result === false) {
// Syntax-Fehler: echo preg_last_error_msg();
} elseif ($result === 0) {
// kein Treffer
} else {
// mindestens ein Treffer – $matches ist gefüllt
}
Der häufigste Stolperstein: preg_match() kann 0 zurückgeben, wenn kein Treffer existiert. Wer nur mit if ($result) prüft, hält das fälschlich für einen Fehler – vermeiden Sie das mit ===.
4. Praxisnahe Beispiele mit regulären Ausdrücken
Bevor wir konkrete Anwendungsfälle durchgehen, folgen nun praxisnahe Beispiele, die zeigen, wie reguläre Ausdrücke in typischen Szenarien eingesetzt werden – von einfachen Prüfungen bis zu komplexeren Mustern.
4.1 E-Mail-Validierung (light)
$pattern = '/^[w.+-]+@([w-]+.)+[A-Za-z]{2,}$/D';
(Hinweis: Eine RFC-konforme Prüfung ist weitaus komplexer; für einfache Formulare genügt diese Variante und alternativ können Sie auch einen Validierungsfilter verwenden.)
Ohne Flag bekäme man statt NULL einen leeren String, was die Logik verkomplizieren kann.
4.6 Suche ab bestimmtem Offset
$pattern = '/bw+b/';
$subject = 'One two three';
preg_match($pattern, $subject, $m, 0, 4); // ab Byte 4 → "two"
5. Das $matches-Array im Detail
Situation
$matches Inhalt
Keine Gruppen
Index 0 enthält den kompletten Treffer
Nummerierte Gruppen
0 = Gesamttreffer, 1, 2, … = Inhalte der Gruppen gemäß Klammer-Reihenfolge
Benannte Gruppen
Zusätzlich zu den numerischen Indizes: assoziative Keys wie 'name', 'age' etc.
PREG_OFFSET_CAPTURE
Jeder Treffer ist ein Array [Wert, Offset], wobei Offset die Startposition ist
PREG_UNMATCHED_AS_NULL
Nicht getroffene optionale Gruppen werden mit NULL belegt statt mit leeren Strings
Ein häufiger Fehler ist der Versuch, optional nicht vorhandene Gruppen direkt zu nutzen, ohne zu prüfen, ob sie existieren. Setzen Sie hier auf das Flag oder isset().
6. Häufige Fallstricke & Best Practices
Greedy Quantifier .* schnappt sich oft zu viel. Anhängen von ? oder präzisere Muster lösen das Problem.
Delimiter escapen Wenn Ihr Muster / enthält, wählen Sie zum Beispiel # als Delimiter oder escapen Sie mit /. Nutzen Sie notfalls preg_quote() um Fremd-Strings sicher einzubetten, indem Sie ein passendes pattern verwenden.
Performance Reguläre Ausdrücke mit vielen verschachtelten Quantifizierern ((.*)+) können Exponential-Backtracking verursachen. Für reine „Substring vorhanden?“-Checks ist str_contains() (ab PHP 8) dramatisch schneller.
Unicode Vergessen Sie nie den u-Modifier, wenn Ihre Texte Umlaute, Emojis etc. enthalten. Sonst bricht w schon bei ä.
HTML-Parsing „HTML mit Regex parsen“ gilt klassisch als No-Go. Nutzen Sie stattdessen DOMDocument, das auch mit character Daten umgehen kann, DOMXPath oder spezialisierten Parser wie simplehtmldom.
Sicherheit (ReDoS) Lassen Sie nie nutzergenerierte Muster ungeprüft auf Ihren Server los. Ein geschickt gebauter Regex kann CPU-Zeit bis zum Timeout fressen.
Lesbarkeit Aktivieren Sie den x-Modifier (/.../x) und fügen Sie Whitespace + Kommentare (?# ... ) hinzu. Ihre Kollegen danken es Ihnen – oder Sie selbst in sechs Monaten.
7. preg_match() vs. preg_match_all() vs. String-Funktionen
Aufgabe
Beste Funktion
Warum?
Existenz eines Musters prüfen
preg_match()
Erster Fund genügt, schneller als preg_match_all().
if (($res = preg_match($pattern, $host, $m)) === 1) {
echo "$host ist ein gültiger Hostnamen";
// ggf. hier fsockopen() → Port 80/443
} elseif ($res === 0) {
echo "$host ist KEIN gültiger Hostnamen";
} else {
fprintf(STDERR, "Regex-Fehler: %sn", preg_last_error_msg());
exit(1);
}
In den Beispiel wird ein regulärer Ausdruck verwendet, der die Regeln für Domainnamen gemäß RFC (z. B. RFC 1035) beachtet:
Der Hostname muss aus Subdomains bestehen, die durch Punkte getrennt sind (z. B. www.example.com).
Jede Subdomain beginnt und endet mit einem Buchstaben oder einer Ziffer, dazwischen sind auch Bindestriche erlaubt.
Die Top-Level-Domain (TLD) am Ende besteht nur aus Buchstaben und ist zwischen 2 und 63 Zeichen lang.
Es wird zwischen Groß- und Kleinschreibung nicht unterschieden.
Das Skript nimmt den zu prüfenden Hostnamen aus $argv[1] (Kommandozeilenargument) oder verwendet www.beispiel.de als Standardwert. Der Rückgabewert von preg_match() wird geprüft:
1: gültiger Hostname
0: ungültiger Hostname
false: Regex-Fehler, wird mit Fehlermeldung abgebrochen
Optional könnte man im Erfolgsfall z. B. mit fsockopen() weiter testen, ob der Host erreichbar ist (Port 80 oder 443).
9. Fazit
preg_match() ist eine der mächtigsten, aber auch am häufigsten missverstandenen Funktionen in PHP. Wer ihre Rückgabewerte nicht exakt unterscheidet oder ohne Unicode-Modifier arbeitet, tappt schnell in Fehlerfallen. Mit den hier gezeigten Best Practices, dem Überblick über Flags und den vielen Beispiel-Snippets sollte Ihnen jedoch jeder typische Anwendungsfall gelingen – von der simplen Existenzprüfung bis zur ausgeklügelten Datenextraktion mit benannten Gruppen und Byte-Offsets.
Nutzen Sie reguläre Ausdrücke, wo sie wirklich einen Mehrwert bieten, und greifen Sie auf String-Funktionen zurück, wenn ein schnelles „kommt vor?“ genügt. So kombinieren Sie Performance, Wartbarkeit und Funktionsumfang optimal.
Tipp zum Weiterlernen: Experimentieren Sie mit Online-Tools wie regex101.com – dort können Sie PHP-kompatible Muster testen, sich den Backtracking-Graphen anzeigen lassen und jedes Stück des Ausdrucks interaktiv erläutern. Sobald Sie Ihr Muster verstanden haben, überführen Sie es 1-zu-1 in Ihr preg_match()-Skript und profitieren Sie von präzise validierten Eingaben.