Start · Sprachen · PHP · Referenz · quotemeta

quotemeta

Funktion

Maskiert in einem String alle regulären Ausdrucks-Metazeichen mit einem Backslash.

seit PHP 4.0.0 Kategorie: string

Signatur

quotemeta(string $string): string

Beschreibung

quotemeta() fügt vor jedem der folgenden Sonderzeichen einen Backslash (\) ein: . \ + * ? [ ^ ] ( $ ). Dadurch werden diese Zeichen als Literale behandelt, wenn der String anschließend in einem regulären Ausdruck verwendet wird.

Typischer Einsatzfall: Ein vom Benutzer eingegebener Text soll als fester Suchbegriff (kein Muster) in einer preg_match()- oder preg_replace()-Funktion genutzt werden. Anstatt selbst alle Sonderzeichen manuell zu escapen, übernimmt quotemeta() diese Aufgabe automatisch.

Für moderne PCRE-basierte Funktionen (preg_*) ist jedoch preg_quote() vorzuziehen, da diese Funktion einen größeren Zeichensatz sowie den optionalen Delimiter-Parameter unterstützt. quotemeta() deckt lediglich die POSIX/ERE-Metazeichen ab und berücksichtigt keinen Delimiter.

Ist der übergebene String leer, gibt die Funktion false zurück (in PHP < 8.0), ab PHP 8.0 wird ein leerer String zurückgegeben. Dies sollte im Code beachtet werden, wenn leere Eingaben möglich sind.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der Eingabe-String, in dem Metazeichen maskiert werden sollen.

Rückgabewert

Typ
string
Beschreibung
Den maskierten String mit Backslashes vor allen Metazeichen. Ist der Eingabe-String leer, wird in PHP < 8.0 false zurückgegeben, ab PHP 8.0 ein leerer String.

Beispiele

Einfache Maskierung von Metazeichen

<?php
$userInput = 'Preis: (5+3) * 2.00$';
$escaped   = quotemeta($userInput);
echo $escaped;
// Ausgabe: Preis\: \(5\+3\) \* 2\.00\$
Preis\: \(5\+3\) \* 2\.00\$

Nutzereingabe als Literal in einem regulären Ausdruck suchen

<?php
$text      = 'Der Rabatt beträgt (10+5) % auf alle Artikel.';
$search    = '(10+5)';
$pattern   = '/' . quotemeta($search) . '/i';

if (preg_match($pattern, $text, $matches)) {
    echo 'Treffer gefunden: ' . $matches[0];
} else {
    echo 'Kein Treffer.';
}
Treffer gefunden: (10+5)

// Wichtig · Fallstricke

Sicherheitshinweis: quotemeta() ist nicht für die Absicherung gegen SQL-Injection oder XSS geeignet. Für PCRE-basierte Funktionen (preg_match, preg_replace etc.) sollte stattdessen preg_quote() verwendet werden, da es einen vollständigeren Zeichensatz (inkl. /, #, ~ etc. je nach Delimiter) maskiert und einen optionalen Delimiter-Parameter unterstützt.

In PHP < 8.0 gibt quotemeta('') den booleschen Wert false zurück, was zu unerwarteten Ergebnissen führen kann, wenn das Ergebnis direkt als String weiterverwendet wird. Ab PHP 8.0 wird ein leerer String zurückgegeben.