Wie ersetzt man verschiedene Newline-Stile in PHP am intelligentesten?

Lesezeit: 5 Minuten

Ich habe einen Text, der möglicherweise unterschiedliche Zeilenumbruchstile hat. Ich möchte alle Zeilenumbrüche ‘\r\n’, ‘\n’,’\r’ durch denselben Zeilenumbruch ersetzen (in diesem Fall \r\n ).

Wie geht das am schnellsten? Meine aktuelle Lösung sieht so aus, was ziemlich scheiße 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);

Das Problem ist, dass Sie dies nicht mit einer Ersetzung tun können, da \r\n in \r\n\r\n dupliziert wird.

Danke für Ihre Hilfe!

  • Sie können PHP_EOL ausprobieren, ich glaube, das wird den Zeilenumbruch basierend auf dem Betriebssystem ändern

    – Drewdin

    20. Oktober 2011 um 13:28 Uhr

  • Woher hast du das, wenn du ‘\r\n’ durch ‘\r\n’ ersetzt, dass du ‘\r\n\r\n’ bekommst?

    – Achtung

    20. Oktober 2011 um 13:31 Uhr

  • @NB codepad.org/Qy6HpnLj

    – ComFreek

    20. Oktober 2011 um 13:33 Uhr

Wie ersetzt man verschiedene Newline Stile in PHP am intelligentesten
NikiC

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

Wenn Sie nicht alle Unicode-Zeilenumbrüche ersetzen möchten, sondern nur diejenigen im CRLF-Stil, verwenden Sie:

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

\R passt zu diesen Zeilenumbrüchen, u ist ein Modifikator, um die Eingabezeichenfolge als UTF-8 zu behandeln.


Von dem PCRE-Dokumente:

Was \R Streichhölzer

Standardmäßig stimmt die Sequenz \R in einem Muster mit jeder Unicode-Zeilenumbruchsequenz überein, unabhängig davon, was als Zeilenendesequenz ausgewählt wurde. Wenn Sie angeben

     --enable-bsr-anycrlf

die Standardeinstellung wird so geändert, dass \R nur mit 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 stimmt die Escape-Sequenz \R standardmäßig mit jeder Unicode-Zeilenumbruchsequenz überein. Im Nicht-UTF-8-Modus entspricht \R dem Folgenden:

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

Dies ist ein Beispiel einer “Atomgruppe”, deren Einzelheiten unten angegeben sind. Diese bestimmte Gruppe entspricht entweder der zweistelligen Folge CR gefolgt von LF oder einem der einzelnen Zeichen LF (Zeilenvorschub, U+000A), VT (vertikaler Tabulator, U+000B), FF (Formvorschub, U+000C), CR (Wagenrücklauf, U+000D) oder NEL (nächste Zeile, U+0085). Die aus zwei Zeichen bestehende Folge wird als eine Einheit behandelt, die nicht geteilt werden kann.

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

Es ist möglich, \R so einzuschränken, dass es nur CR, LF oder CRLF (anstelle des vollständigen Satzes von Unicode-Zeilenenden) abgleicht, indem die Option PCRE_BSR_ANYCRLF entweder zur Kompilierungszeit oder bei Übereinstimmung mit dem Muster gesetzt wird. (BSR ist eine Abkürzung für “Backslash R”.) Dies kann zum Standard gemacht werden, 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 Sie eine Musterzeichenfolge mit einer der folgenden Sequenzen beginnen:

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

Diese überschreiben die Voreinstellung und die pcre_compile() oder pcre_compile2() gegebenen Optionen, aber sie können durch pcre_exec() oder pcre_dfa_exec() gegebene Optionen überschrieben werden. Beachten Sie, dass diese speziellen Einstellungen, die nicht Perl-kompatibel sind, nur ganz am Anfang eines Musters erkannt werden und in Großbuchstaben geschrieben werden 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; Beispielsweise kann ein Muster beginnen mit:

    (*ANY)(*BSR_ANYCRLF)

Sie können auch mit den Sondersequenzen (*UTF8) oder (*UCP) kombiniert werden. Innerhalb einer Zeichenklasse wird \R als nicht erkannte Escape-Sequenz behandelt und entspricht daher standardmäßig dem Buchstaben “R”, verursacht jedoch einen Fehler, wenn PCRE_EXTRA gesetzt ist.

  • Sie können auch PHP_EOL verwenden, um das Dateiende der Installation abzugleichen. preg_replace(‘~\R~u’, PHP_EOL, $string);

    – James Grundner

    21. April 2015 um 19:08 Uhr

Um Zeilenumbrüche zu normalisieren verwende ich immer:

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

Es ersetzt den alten Mac (\r) und das Fenster (\r\n) Zeilenumbrüche mit dem Unix-Äquivalent (\n).

Ich benutze lieber \n weil es nur ein Byte statt zwei braucht, aber Sie können es leicht ändern \r\n.

Wie ersetzt man verschiedene Newline Stile in PHP am intelligentesten
Tomalak

Wie wäre es mit

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

  • Zweite Zeichenfolge benötigt doppelte Anführungszeichen 😉

    – Nikic

    20. Oktober 2011 um 13:32 Uhr

  • Nein, tut es nicht. ideone.com/xZLsx – Warum sollte es Ihrer Meinung nach doppelte Anführungszeichen benötigen?

    – Tomalak

    20. Oktober 2011 um 13:39 Uhr


  • Weil Escape-Sequenzen nur in doppelten Anführungszeichen analysiert werden. Es ist in Ordnung für Regex, weil das Escape-Sequenzen extra analysiert, aber nicht für alle anderen Strings. Daher muss das zweite Argument in doppelte Anführungszeichen gesetzt werden, andernfalls wird anstelle eines Zeilenumbruchs ein einfaches \r\n ausgegeben

    – Nikic

    20. Oktober 2011 um 13:44 Uhr

  • @Tomalek codepad.viper-7.com/XJpmkP (Und da Sie mir nicht vertrauen, schauen Sie sich die Dokumentation an: php.net/manual/en/language.types.string.php)

    – Nikic

    20. Oktober 2011 um 14:08 Uhr

  • Beeindruckend. Dies… Sie stell das einfach da hin! 😉 Ehrlich gesagt bin ich total überrascht. Ich war mir so sicher, dass die variable Interpolation der einzige Unterschied war, dass ich mir nicht einmal die Mühe machte, nachzuschlagen. Okay danke. Etwas gelernt. 🙂 — und mein Codebeispiel korrigiert.

    – Tomalak

    20. Oktober 2011 um 18:14 Uhr


Wie ersetzt man verschiedene Newline Stile in PHP am intelligentesten
Roy

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

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

nur in LF umwandeln:

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

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

$sNicetext = str_replace(["\r\n", "\r"], "\n", $sNicetext);

funktioniert auch

  • Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können

    – Nico Haase

    12. Januar 2021 um 7:35 Uhr

  • Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können

    – Nico Haase

    12. Januar 2021 um 7:35 Uhr

924510cookie-checkWie ersetzt man verschiedene Newline-Stile in PHP am intelligentesten?

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

Privacy policy