Frage

Ich habe einen Text, der unterschiedliche Newline -Stile hat. Ich möchte alle Newlines ' r n', ' n', ' r' durch die gleiche neue Linie (in diesem Fall r n) ersetzen.

Was ist der schnellste Weg, dies zu tun? Meine aktuelle Lösung sieht so aus, wie es sehr sauert ist:

    $sNicetext = str_replace("\r\n",'%%%%somthing%%%%', $sNicetext);
    $sNicetext = str_replace(array("\r","\n"),array("\r\n","\r\n"), $sNicetext);
    $sNicetext = str_replace('%%%%somthing%%%%',"\r\n", $sNicetext);

Problem ist, dass Sie dies nicht mit einem Ersatz tun können, da das r n zu r n r n dupliziert wird.

Danke für Ihre Hilfe!

War es hilfreich?

Lösung

$string = preg_replace('~\R~u', "\r\n", $string);

Verwenden Sie:

$string = preg_replace('~(*BSR_ANYCRLF)\R~', "\r\n", $string);

\R entspricht diesen neuen Zeilen, u ist ein Modifikator zur Behandlung der Eingangszeichenfolge als UTF-8.


Von dem Pcre docs:

Was \R Streichhölzer

Standardmäßig entspricht die Sequenz R in einem Muster jeder Unicode -Newline -Sequenz, was auch immer als Zeilenendesequenz ausgewählt wurde. Wenn Sie angeben

     --enable-bsr-anycrlf

Die Standardeinstellung wird so geändert, dass R nur CR, LF oder CRLF übereinstimmt. Was auch immer ausgewählt wird, wenn PCRE erstellt wird, kann überschrieben werden, wenn die Bibliotheksfunktionen aufgerufen werden.

und

Newline -Sequenzen

Außerhalb einer Zeichenklasse entspricht die Escape -Sequenz r jeder Unicode -Newline -Sequenz. Im Nicht-UTF-8-Modus R entspricht den folgenden:

    (?>\r\n|\n|\x0b|\f|\r|\x85)

Dies ist ein Beispiel für eine "Atomgruppe", deren Details unten angegeben sind. Diese bestimmte Gruppe entspricht entweder mit der Zwei-Charakter-Sequenz-CR, gefolgt von LF oder einem der einzelnen Zeichen LF (LineFeed, U+000A), VT (vertikale Tab, U+000B), FF (Formfeed, U+000C), CR (Wagenrückgabe, U+000D) oder NEL (nächste Zeile, U+0085). Die Zwei-Charakter-Sequenz wird als einzelne Einheit behandelt, die nicht gespalten werden kann.

Im UTF-8-Modus werden zwei zusätzliche Zeichen, deren CodePoints größer als 255 sind, hinzugefügt: LS (Zeilenabscheider, U+2028) und PS (Absatzseparator, U+2029). Die Unterstützung von Unicode -Charaktereigenschaften ist nicht erforderlich, damit diese Zeichen erkannt werden können.

Es ist möglich, R auf nur CR, LF oder CRLF (anstelle der vollständigen Menge der Unicode -Zeilenende) einzuschränken, indem die Option pcre_bsr_anycrlf entweder zum Kompilierungszeit oder beim Stimmen des Musters festgelegt wird. (BSR ist eine Abkürzung für "Backslash R".) Dies kann den Standardwert erfolgen, wenn PCRE erstellt wird. Wenn dies der Fall ist, kann das andere Verhalten über die Option PCRE_BSR_UNICODE angefordert werden. Es ist auch möglich, diese Einstellungen anzugeben, indem eine Musterzeichenfolge mit einer der folgenden Sequenzen gestartet wird:

    (*BSR_ANYCRLF)   CR, LF, or CRLF only
    (*BSR_UNICODE)   any Unicode newline sequence

Diese überschreiben die Standardeinstellung und die Optionen an pcre_compile () oder pcre_compile2 (), können jedoch durch Optionen an pcre_exec () oder pcre_dfa_exec () überschrieben werden. Beachten Sie, dass diese speziellen Einstellungen, die nicht perl-kompatibel sind, nur zu Beginn eines Musters erkannt werden und dass sie sich im oberen Fall befinden müssen. Wenn mehr als einer von ihnen vorhanden ist, wird der letzte verwendet. Sie können mit einer Änderung der Newline -Konvention kombiniert werden. Zum Beispiel kann ein Muster mit:

    (*ANY)(*BSR_ANYCRLF)

Sie können auch mit den speziellen Sequenzen (*utf8) oder (*ucp) kombiniert werden. In einer Zeichenklasse wird R als nicht erkannte Fluchtsequenz behandelt und stellt so standardmäßig mit dem Buchstaben "R" überein, verursacht jedoch einen Fehler, wenn pcre_extra festgelegt wird.

Andere Tipps

Um Neulinien zu normalisieren, benutze ich immer:

$str = preg_replace('~\r\n?~', "\n", $str);

Es ersetzt den alten Mac (\r) und die Fenster (\r\n) Newlines mit dem Unix -Äquivalent (\n).

Ich verwende \n Weil es nur ein Byte anstelle von zwei braucht, aber Sie können es leicht ändern \r\n.

Wie wäre es mit

$sNicetext = preg_replace('/\r\n|\r|\n/', "\r\n", $sNicetext);

Ich denke, der klügste/einfachste Weg, in CRLF umzuwandeln, ist:

$output = str_replace("\n", "\r\n", str_replace("\r", '', $input));

Nur in LF konvertieren:

$output = str_replace("\r", '', $input);

Es ist viel einfacher als reguläre Ausdrücke.

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