preg_match()
Die PHP-Funktion preg_match() führt einen regulären Ausdrucks-Abgleich gegen einen String durch und gibt 1 bei Treffer oder 0 zurück.
Einführung
preg_match() führt einen regulären Ausdrucks-Abgleich gegen einen String durch. Die Funktion gibt an, ob ein PCRE-Muster im zu prüfenden String vorkommt, und erfasst optional was übereinstimmt. Sie stoppt beim ersten Treffer — wenn jedes Vorkommen benötigt wird, verwenden Sie stattdessen preg_match_all().
Dieses Kapitel behandelt die Signatur und Rückgabewerte, die Befüllung des $matches-Arrays, die nützlichsten Flags und die häufigen Fallstricke (die 0-vs-false-Falle, Verankerung, Trennzeichen), über die man gerne stolpert.
Syntax
preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false| Parameter | Beschreibung |
|---|---|
$pattern | Das Muster einschließlich Trennzeichen und optionaler Modifikatoren, z. B. '/colou?r/i'. |
$subject | Der zu durchsuchende String. |
&$matches | Wird per Referenz gefüllt: $matches[0] ist der vollständige Treffer, $matches[1], $matches[2]… sind die Erfassungsgruppen. |
$flags | Bit-Flags wie PREG_OFFSET_CAPTURE und PREG_UNMATCHED_AS_NULL. |
$offset | Byte-Offset, ab dem die Suche beginnt. |
Rückgabewert: 1 wenn das Muster übereinstimmt, 0 wenn nicht, oder false bei einem Fehler (ungültiges Muster). Da preg_match() höchstens 1 zurückgibt, teilt es nie mit, wie viele Treffer es gibt — nur ob es einen gab.
Einfaches Beispiel
Das Muster erfasst ein alphabetisches Wort, gefolgt von Leerzeichen und einem weiteren Wort. Bei einem Treffer enthält $matches[0] den vollständigen Treffer (This is) und $matches[1] / $matches[2] die beiden erfassten Gruppen (This und is).
Die 0-vs-false-Falle
Ein sehr häufiger Fehler ist die Verwendung von == zur Prüfung des Ergebnisses. preg_match() gibt 0 für „kein Treffer" und false nur bei einem Fehler zurück, und 0 == false ist in PHP true. Vergleichen Sie immer mit dem strengen Operator:
<?php
$result = preg_match('/[0-9]+/', 'abc');
// Wrong: treats "no match" and "error" the same
if ($result == false) {
echo "ambiguous\n";
}
// Right: distinguish the three outcomes
if ($result === false) {
echo "Error in the pattern\n";
} elseif ($result === 0) {
echo "No match\n";
} else {
echo "Matched\n";
}Dies gibt ambiguous und danach No match aus.
Benannte Gruppen
Fügen Sie (?<name>...) zu Ihrem Muster hinzu, und $matches enthält die Erfassungen sowohl unter dem numerischen Index als auch unter dem Namen, was den Code lesbar hält, wenn sich die Gruppenreihenfolge ändert:
<?php
$date = '2026-06-21';
preg_match('/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/', $date, $m);
echo $m['year'] . "\n"; // 2026
echo $m['month'] . "\n"; // 06
echo $m['day']; // 21Offsets erfassen mit PREG_OFFSET_CAPTURE
Übergeben Sie das Flag PREG_OFFSET_CAPTURE, und jeder Eintrag in $matches wird zu einem [übereinstimmender_text, byte_offset]-Paar, sodass Sie erkennen können, wo der Treffer aufgetreten ist:
<?php
preg_match('/world/', 'hello world', $m, PREG_OFFSET_CAPTURE);
echo $m[0][0] . "\n"; // world
echo $m[0][1]; // 6Groß-/Kleinschreibung ignorierende und verankerte Muster
Modifikatoren stehen nach dem schließenden Trennzeichen. Der Modifikator i ignoriert die Groß-/Kleinschreibung; ^ und $ verankern den Treffer am Anfang und Ende des Strings, sodass der gesamte Subject dem Muster entsprechen muss:
<?php
var_dump(preg_match('/^hello$/i', 'HELLO')); // int(1)
var_dump(preg_match('/^hello$/i', 'hello!')); // int(0)Wann man zu einer anderen Funktion greift
- Jedes Vorkommen, nicht nur das erste →
preg_match_all(). - Suchen und Ersetzen →
preg_replace(). - Einen String an einem Muster aufteilen →
preg_split(); für ein festes Trennzeichen ist das einfacheexplode()schneller. - Benutzereingaben maskieren, bevor sie in ein Muster eingebettet werden →
preg_quote(). - Eine Auffrischung zur PCRE-Syntax → das Kapitel PHP-reguläre Ausdrücke.
Fazit
preg_match() ist die erste Wahl, um zu testen, ob ein String einem Muster entspricht, und um erfasste Gruppen zu extrahieren. Denken Sie an die drei Rückgabewerte, vergleichen Sie mit ===, um die 0/false-Falle zu vermeiden, und wechseln Sie zu preg_match_all(), wenn ein Treffer nicht ausreicht.