Extra Backslash in PHP RegexMuster benötigt
Frage
Wenn Sie eine Antwort Prüfung für Noch eine Frage des Benutzers ich etwas gefunden habe ich nicht verstehen. Das Problem war, alle wörtlichen \t
\n
\r
Zeichen aus einem String mit einem Leerzeichen zu ersetzen.
Nun, das erste Muster habe ich versucht war:
/(?:\\[trn])+/
, die überraschenderweise nicht funktionierte. Ich habe versucht, das gleiche Muster in Perl und es funktionierte gut. Nach einigem Versuch und Irrtum fand ich, dass PHP will 3 oder 4 Schrägstriche für das Muster entsprechen, wie in:
/(?:\\\\[trn])+/
oder
/(?:\\\[trn])+/
diese Muster - zu meiner Überraschung - beide arbeiten. Warum sind diese zusätzlichen Schrägstriche notwendig?
Lösung
Sie müssen 4 Schrägstriche 1 in regex darzustellen, weil:
- 2 Schrägstriche sind für URL-Kodierung in einem String verwendet (
"\\\\" -> \\
) - 1 Backslash wird verwendet für URL-Kodierung in der Regex-Engine (
\\ -> \
)
Von der PHP-doc,
führen andere Zeichen zu entkommen in der umgekehrten Schrägstrich, die gedruckt 1
Daher für \\\[
,
- 1 Backslash für URL-Kodierung der
\
verwendet wird, ein Aufenthalt, weil\[
ungültig ("\\\[" -> \\[
) - 1 Backslash wird verwendet für URL-Kodierung in der Regex-Engine (
\\[ -> \[
)
Ja, es funktioniert, aber keine gute Praxis.
Andere Tipps
Seine Werke in Perl, weil Sie passieren, dass direkt als RegexMuster /(?:\\[trn])+/
aber in php, müssen Sie sich als String zu übergeben, so dass zusätzliche Bedarf an Backslash selbst.
"/(?:\\\\[trn])+/"
Die Regex \ ein einziges Übereinstimmen Backslash würde ‚/ \\\\ /‘ als PHP Preg String
Der reguläre Ausdruck is nur /(?:\\[trn])+/
. Aber da Sie die Schrägstriche in String Erklärungen als auch entkommen müssen, muss jeder Backslash mit \\
ausgedrückt werden:
"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'
Nur drei Rückschritte machen auch Arbeit, weil PHP kennt nicht die Escape-Sequenz \[
und ignoriert es. So \\
\
werden wird, aber \[
wird \[
bleiben.
Mit str_replace!
$code = str_replace(array("\t","\n","\r"),'',$code);
Wenn der Trick