Zusätzlicher Backslash im PHP-Regexp-Muster

7

Beim Testen einer Antwort für die Frage eines anderen Benutzers habe ich etwas gefunden, das ich nicht gefunden habe verstehen. Das Problem bestand darin, alle literalen Zeichen \t \n \r aus einer Zeichenfolge mit einem einzelnen Leerzeichen zu ersetzen.

Nun, das erste Muster, das ich ausprobiert habe, war:

%Vor%

was überraschenderweise nicht funktioniert hat. Ich habe das gleiche Muster in Perl versucht und es hat gut funktioniert. Nach einigem Ausprobieren fand ich, dass PHP 3 oder 4 umgekehrte Schrägstriche für dieses Muster benötigt, wie in:

%Vor%

oder

%Vor%

diese Muster - zu meiner Überraschung - funktionieren beide. Warum sind diese zusätzlichen Backslashes notwendig?

    
Matteo Riva 27.01.2010, 09:47
quelle

4 Antworten

12

Sie benötigen 4 umgekehrte Schrägstriche, um in Regex 1 darzustellen, weil:

  • 2 Backslashes werden für das Unrescaping in einer Zeichenfolge ( "\\" -> \ )
  • verwendet
  • 1 Backslash wird für das Unrescaping in der Regex-Engine ( \ -> \ )
  • verwendet

Aus dem PHP-Dokument,

  

Wenn Sie ein anderes Zeichen ausschließen, wird der Backslash zu 1

Also für \\[ ,

  • 1 Backslash wird verwendet, um die \ zu entfernen, eine bleibt, weil \[ ungültig ist ( "\\[" -> \[ )
  • 1 Backslash wird für das Unrescaping in der Regex-Engine ( \[ -> \[ )
  • verwendet

Ja, es funktioniert, aber keine gute Praxis.

    
kennytm 27.01.2010, 09:51
quelle
8

Es funktioniert in Perl, weil Sie das direkt als Regex-Muster /(?:\[trn])+/

übergeben

aber in PHP, müssen Sie als Zeichenfolge übergeben, so müssen zusätzliche Escaping für Backslash selbst.

%Vor%
  

Die Regex \, um eine einzelne zu finden   Backslash würde '/ \\\\' als ein    PHP-Preg-String

    
YOU 27.01.2010 09:53
quelle
2

Der reguläre Ausdruck ist nur /(?:\[trn])+/ . Aber da Sie die Backslashes auch in String-Deklarationen umgehen müssen, muss jeder Backslash mit \ :

ausgedrückt werden %Vor%

Nur drei Backspaces funktionieren auch, weil PHP die Escape-Sequenz \[ nicht kennt und ignoriert. So wird \ \ , aber \[ bleibt \[ .

    
Gumbo 27.01.2010 09:51
quelle
-2

Benutze str_replace!

%Vor%

Sollte den Trick machen

    
AntonioCS 27.01.2010 09:58
quelle

Tags und Links