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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top