Gibt es eine PHP-Funktion, die Regex-Mustern entgehen kann, bevor sie angewendet werden?

161

Gibt es eine PHP-Funktion, die Regex-Mustern entgehen kann, bevor sie angewendet werden?

Ich suche etwas in Anlehnung an die C # Regex.Escape()-Funktion.

vfclists
quelle

Antworten:

254

preg_quote() ist was Sie suchen:

Beschreibung

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote () nimmt str einen Backslash vor jedes Zeichen, das Teil der Syntax für reguläre Ausdrücke ist. Dies ist nützlich, wenn Sie eine Laufzeitzeichenfolge haben, die in einem Text übereinstimmen muss, und die Zeichenfolge möglicherweise spezielle Regex-Zeichen enthält.

Die speziellen Zeichen für reguläre Ausdrücke sind: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Parameter

str

Die Eingabezeichenfolge.

Trennzeichen

Wenn das optionale Trennzeichen angegeben ist, wird es ebenfalls maskiert. Dies ist nützlich, um das Trennzeichen zu umgehen, das für die PCRE-Funktionen erforderlich ist. Das / ist das am häufigsten verwendete Trennzeichen.

Beachten Sie, dass $delimiterdas Trennzeichen - das Zeichen, das zum Einschließen Ihres regulären Ausdrucks verwendet wird, normalerweise ein Schrägstrich ( /) - nicht maskiert wird, wenn das Argument nicht angegeben wird. Normalerweise möchten Sie das von Ihnen verwendete Trennzeichen mit Ihrem regulären Ausdruck als $delimiterArgument übergeben.

Beispiel - Verwenden preg_match, um Vorkommen einer bestimmten URL zu finden, die von Leerzeichen umgeben ist:

$url = 'http://stackoverflow.com/questions?sort=newest';

// preg_quote escapes the dot, question mark and equals sign in the URL (by
// default) as well as all the forward slashes (because we pass '/' as the
// $delimiter argument).
$escapedUrl = preg_quote($url, '/');

// We enclose our regex in '/' characters here - the same delimiter we passed
// to preg_quote
$regex = '/\s' . $escapedUrl . '\s/';
// $regex is now:  /\shttp\:\/\/stackoverflow\.com\/questions\?sort\=newest\s/

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
preg_match($regex, $haystack, $matches);

var_dump($matches);
// array(1) {
//   [0]=>
//   string(48) " http://stackoverflow.com/questions?sort=newest "
// }
Tom Haigh
quelle
11
Eine zusätzliche Bemerkung zur Antwort von @TomHaigh : Wenn Sie das zweite $delimiterArgument nicht angeben , entgeht preg_quote() kein Trennzeichen , nicht einmal der "Standard" (oder der häufigste) /.
Alix Axel
Ich habe dieser Antwort eine ganze Reihe von Dingen hinzugefügt - die Notiz von @AlixAxel über die Wichtigkeit des $delimiterArguments, die Beschreibung dieses Arguments aus den Dokumenten, eine Klarstellung für die Verwirrten darüber, was es genau bedeutet, und eine starke Ein kommentiertes Beispiel zeigt preg_quote, wie es im einfachsten Fall verwendet wird. Ich könnte mir vorstellen, wo es tatsächlich verwendet wird, um einen regulären Ausdruck programmgesteuert zu bilden und ihn in eine andere preg_*Funktion einzufügen (denn sonst, worum geht es?). Fühlen Sie sich frei, einen Rollback durchzuführen, wenn Ihnen die Änderung nicht gefällt.
Mark Amery
1

Es wäre viel sicherer, vorbereitete Muster aus der T-Regx-Bibliothek zu verwenden :

$url = 'http://stackoverflow.com/questions?sort=newest';

$pattern = Pattern::prepare(['\s', [$url], '\s']);
                                // ↑ $url is quoted

Führen Sie dann ein normales T-Regx- Match durch:

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";

$matches = $pattern->match($haystack)->all();
Danon
quelle