PHP: RegEx-Muster umgehen, um die Anwendung zu verhindern?

Lesezeit: 3 Minuten

Benutzeravatar von vfclists
vfclists

Gibt es eine PHP-Funktion, die RegEx-Mustern entkommen kann, um zu verhindern, dass sie angewendet werden, wenn sie in einem anderen RegEx-Muster verwendet werden?

Ich suche etwas in der Art von C# Regex.Escape() Funktion.

Tom Haighs Benutzeravatar
Tom Haigh

preg_quote() ist das, wonach Sie suchen:

Beschreibung

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

preg_quote() dauert str und fügt vor jedem Zeichen, das Teil der regulären Ausdruckssyntax ist, einen Backslash ein. 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 Sonderzeichen 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 maskieren, das für die PCRE-Funktionen erforderlich ist. Das / ist das am häufigsten verwendete Trennzeichen.

Beachten Sie unbedingt, dass, wenn die $delimiter Argument ist nicht angegeben, das Trennzeichen – das Zeichen, das zum Einschließen Ihres regulären Ausdrucks verwendet wird, üblicherweise ein Schrägstrich (/) – wird nicht entkommen. Normalerweise möchten Sie das Trennzeichen, das Sie mit Ihrer Regex verwenden, als übergeben $delimiter Streit.

Beispiel – Verwendung preg_match So finden Sie Vorkommen einer bestimmten URL, 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 "https://stackoverflow.com/" as the
// $delimiter argument).
$escapedUrl = preg_quote($url, "https://stackoverflow.com/");

// We enclose our regex in "https://stackoverflow.com/" 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 "
// }

  • Eine zusätzliche Bemerkung zur Antwort von @TomHaigh, falls Sie die zweite nicht angeben $delimiter Argument zu preg_quote() Es wird keinem Trennzeichen entgehennicht einmal die „Standardeinstellung“ (oder die gebräuchlichste) /.

    – Alix Axel

    20. Juni 2012 um 3:39


  • Ich habe dieser Antwort eine ganze Reihe von Dingen hinzugefügt – den Hinweis von @AlixAxel über die Wichtigkeit von $delimiter Argument, die Beschreibung dieses Arguments aus den Dokumenten, eine Erläuterung für die Verwirrung darüber, was es genau bedeutet, und ein ausführlich kommentiertes Beispiel, das es zeigt preg_quote Im einfachsten Fall könnte ich mir vorstellen, wo es tatsächlich verwendet wird, um programmgesteuert einen regulären Ausdruck zu bilden und ihn in einen anderen einzufügen preg_* Funktion (denn sonst, worum geht es?). Wenn Ihnen die Änderung nicht gefällt, können Sie jederzeit einen Rollback durchführen.

    – Mark Amery

    21. September 2015 um 23:04 Uhr

  • @AlixAxel Die Funktion preg_quote() entgeht einigen Trennzeichen, einschließlich =: < und >. Siehe meinen Artikel: abareplace.com/blog/escape-regexp

    – Peter Kankowski

    8. Januar 2022 um 11:41


Danons Benutzeravatar
Danon

Die Verwendung wäre viel sicherer Vorbereitete Muster aus T-Regx:

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

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

Führen Sie dann ein normales Match durch:

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

$matcher = pattern->match($haystack);
foreach ($matcher as $match) {
}

Sie können es sogar mit verwenden preg_match():

preg_match($pattern, 'foo', $matches);

  • Können Sie bitte erklären, warum es „sicherer“ sein sollte, eine andere Bibliothek einzubinden, wenn ein Standard-PHP die Aufgabe erledigt?

    – Adrian

    18. Januar 2022 um 7:38

  • Vanilla PHP funktioniert nicht in allen Fällen. Zum Beispiel Zeichenfolge "\\" verursacht einen Fehler, wenn es das letzte Zeichen ist.

    – Danon

    24. Januar 2022 um 13:07 Uhr

  • Dies ist die zweite Antwort, die ich an einem Tag von Ihnen gesehen habe, in der Sie diese Bibliothek erwähnen, und jetzt wird mir klar, dass es daran liegt, dass es Ihre eigene ist. Die SO-Richtlinie verlangt, dass Sie in Ihrer Antwort alle Zusammenhänge deutlich machen, wenn Sie Ihre eigenen Tools empfehlen.

    – Hashim Aziz

    21. März um 19:02 Uhr

  • @HashimAziz Danke für den Hinweis, ich habe die Antwort vor 4 Jahren gepostet, direkt nachdem ich die Bibliothek erstellt habe. Ich war jung und albern, akzeptiere meine Entschuldigung.

    – Danon

    22. März um 8:22 Uhr

1454460cookie-checkPHP: RegEx-Muster umgehen, um die Anwendung zu verhindern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy