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.
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.
Antworten:
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 $delimiter
das 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 $delimiter
Argument übergeben.
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 "
// }
$delimiter
Arguments, 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.
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();
$delimiter
Argument nicht angeben , entgehtpreg_quote()
kein Trennzeichen , nicht einmal der "Standard" (oder der häufigste)/
.