Start · Sprachen · PHP · Referenz · preg_last_error_msg

preg_last_error_msg

Funktion

Gibt die menschenlesbare Fehlermeldung des zuletzt aufgetretenen PCRE-Regex-Fehlers als <code>string</code> zurück.

seit PHP 8.0.0 Kategorie: regex

Signatur

preg_last_error_msg(): string

Beschreibung

preg_last_error_msg() liefert eine beschreibende Fehlermeldung zum Fehlercode, den preg_last_error() zurückgibt. Damit lassen sich Fehler bei regulären Ausdrücken (z. B. Backtracking-Limits überschritten, ungültige UTF-8-Eingabe) direkt im Klartext ausgeben oder protokollieren, ohne die Fehlercodes selbst in Text übersetzen zu müssen.

Trat bisher kein Fehler auf, gibt die Funktion 'No error' zurück. Die zurückgegebene Zeichenkette entspricht dem menschenlesbaren Namen des jeweiligen PREG_*-Fehlercodes, zum Beispiel 'Backtrack limit exhausted' für PREG_BACKTRACK_LIMIT_ERROR.

Die Funktion ist besonders nützlich im Zusammenspiel mit preg_match(), preg_match_all(), preg_replace() und verwandten Funktionen, wenn deren Rückgabewert false oder null ist und eine detaillierte Fehleranalyse benötigt wird.

Rückgabewert

Typ
string
Beschreibung
Gibt einen menschenlesbaren Fehlertext zurück. Ist kein Fehler aufgetreten, wird 'No error' zurückgegeben.

Beispiele

Backtracking-Limit-Fehler erkennen und ausgeben

<?php
// Regex mit extremem Backtracking-Aufwand
$result = preg_match('/(?:\S+\s*)*$/', str_repeat('a', 1000));

if ($result === false) {
    echo 'Regex-Fehler: ' . preg_last_error_msg() . PHP_EOL;
    echo 'Fehlercode:   ' . preg_last_error() . PHP_EOL;
} else {
    echo 'Kein Fehler aufgetreten.' . PHP_EOL;
}
Regex-Fehler: Backtrack limit exhausted Fehlercode: 2

Fehlerbehandlung bei preg_replace in einer Hilfsfunktion

<?php
function safe_replace(string $pattern, string $replacement, string $subject): string
{
    $result = preg_replace($pattern, $replacement, $subject);

    if ($result === null) {
        $msg = preg_last_error_msg();
        throw new RuntimeException('preg_replace fehlgeschlagen: ' . $msg);
    }

    return $result;
}

try {
    $output = safe_replace('/[a-z]+/', 'X', 'hallo welt');
    echo $output . PHP_EOL;
} catch (RuntimeException $e) {
    echo $e->getMessage() . PHP_EOL;
}
X X

Kein Fehler – Standardausgabe prüfen

<?php
preg_match('/^\d+$/', '12345');
echo preg_last_error_msg() . PHP_EOL;
No error

// Wichtig · Fallstricke

Die Funktion gibt immer den Status des zuletzt aufgerufenen PCRE-Vorgangs zurück. Bei der Fehlerbehandlung sollte sie daher unmittelbar nach dem fehlgeschlagenen Aufruf aufgerufen werden, bevor weitere Regex-Operationen stattfinden, die den Fehlercode überschreiben könnten.

Vor PHP 8.0 musste man den numerischen Fehlercode von preg_last_error() manuell mit einer switch-Anweisung oder einem Array in Text umwandeln. preg_last_error_msg() macht dies überflüssig und ist daher die bevorzugte Methode in modernem PHP-Code.