Wie kann ich Zeilenumbruch oder \ r \ n durch <br/> ersetzen?

74

Ich versuche einfach einige neue Zeilen zu ersetzen und habe drei verschiedene Möglichkeiten ausprobiert, aber ich bekomme keine Änderung:

$description = preg_replace('/\r?\n|\r/', '<br/>', $description);
$description = str_replace(array("\r\n", "\r", "\n"), "<br/>", $description);
$description = nl2br($description);

Diese sollten alle funktionieren, aber ich bekomme immer noch die Zeilenumbrüche. Sie sind doppelt: "\ r \ r". Das sollte keines davon zum Scheitern bringen, oder?

theflowersoftime
quelle
1
Warum hast du nackte \rZeilenumbrüche? AFAIK wechselte sogar zu MacOSX \n.
ThiefMaster
Sie kommen aus der CSV eines Kunden.
Theflowersoftime

Antworten:

134

Es gibt bereits die nl2br()Funktion, die <br> Tags vor neuen Zeilenzeichen einfügt :

Beispiel ( Codepad ):

<?php
// Won't work
$desc = 'Line one\nline two';
// Should work
$desc2 = "Line one\nline two";

echo nl2br($desc);
echo '<br/>';
echo nl2br($desc2);
?>

Wenn es immer noch nicht funktioniert, stellen Sie sicher, dass der Text $desciptionin doppelten Anführungszeichen steht.

Dies liegt daran, dass einfache Anführungszeichen Escape-Sequenzen wie den \nVergleich mit Zeichenfolgen in doppelten Anführungszeichen nicht erweitern . Zitat aus der PHP-Dokumentation:

Hinweis : Im Gegensatz zu den Syntaxen in doppelten Anführungszeichen und Heredoc werden Variablen und Escape-Sequenzen für Sonderzeichen nicht erweitert, wenn sie in Zeichenfolgen in einfachen Anführungszeichen vorkommen.

Robik
quelle
Schauen Sie genauer hin, er das OP zeigt ausdrücklich, dass sie versucht haben zu verwenden nl2brund dass es nicht funktioniert hat.
Tim Bielawa
Ich habe gerade versucht, nl2br auf einem String mit doppeltem Wagenrücklauf auszuführen, und es hat gut funktioniert.
Decko
1
Schau dir meine Bearbeitung @ThomasMcCabe an. Ich habe einige (vielleicht) nützliche Informationen hinzugefügt.
Robik
21
Bitte beachten Sie, dass nl2brsich nicht ersetzen , sondern EINSÄTZE vor Zeilenumbrüche, die die nl Zeichen und verleiht ihm br bevor sie verlässt.
Brock Hensley
Aber wenn wir eine Datei mit Zeilenumbrüchen haben und diese mit einem PHP-Skript lesen und diese Zeilenumbrüche interpretieren möchten, wie geht das?
user3911183
61

Versuchen Sie Folgendes:

$description = preg_replace("/\r\n|\r|\n/", '<br/>', $description);
afarazit
quelle
12
Eine schnellere Alternative könnte $description = str_replace(["\r\n", "\r", "\n"], "<br/>", $description)aus dieser Antwort
Keale
7
(Man könnte auch nur /\R/für alle CR / LF- Zeilenumbruchkombinationen verwenden.)
Mario
17

Möglicherweise haben Sie echte Zeichen "\" in der Zeichenfolge (die Zeichenfolgen in einfachen Anführungszeichen, wie @Robik gesagt).

Wenn Sie sich ziemlich sicher sind, dass die Zeichenfolgen '\ r' oder '\ n' ebenfalls ersetzt werden sollten, spreche ich hier nicht von Sonderzeichen, sondern von einer Folge von zwei Zeichen '\' und 'r', dann entkommen Sie dem '\ 'in der Ersetzungszeichenfolge und es wird funktionieren:

str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),"<br/>",$description);
Regilero
quelle
nl2br ist nett, aber das funktioniert tatsächlich (für meine json-Sachen), danke!
Valmond
6

nl2br() wie Sie haben, sollte es gut funktionieren:

$description = nl2br($description);

Es ist wahrscheinlicher, dass das nicht geschlossene 'in der ersten Zeile Ihres Beispielcodes Ihr Problem verursacht. Entfernen Sie die 'after $ description ...

...$description');
Sakatc
quelle
5

Versuche dies:

echo str_replace(array('\r\n', '\n\r', '\n', '\r'), '<br>', $description);
l2aelba
quelle
2
Lesen Sie mehr über PHP- Strings . '\r\n'ist nicht dasselbe wie "\r\n".
Axiac
Danke @axiac, ich habe keine Zeit zum Testen, aber du meinst, es sollte so etwas wie "\r\n"richtig sein?
l2aelba
3

Dies wird sicher funktionieren:

str_replace("\\r", "<br />", $description); 
str_replace("\\n", "<br />", $description); 
Radeck
quelle
Absolut falscher Vorschlag. "foo \\ r \\ nbar" wird zu "foobar" anstelle von "foo <br/> bar". Vor dem Ersetzen von HTML wird "foo bar" gerendert.
Artemix
Meh. Funktioniert in bestimmten Fällen, in denen die Eingabe ein bekanntes Format hat.
evandentremont
3

nl2br () hat bei mir funktioniert, aber ich musste die Variable in doppelte Anführungszeichen setzen:

Das funktioniert:

$description = nl2br("$description");

Das funktioniert nicht:

$description = nl2br($description);
infografnet
quelle
Was ist die Erklärung?
Peter Mortensen
1
$description = nl2br(stripcslashes($description));
softcod.com
quelle
1
Die Erklärung fehlt in dieser Antwort.
Mickmackusa
0

Ich denke str_replace(array("\\r\\n", "\\r", "\\n"), " ", $string); wird funktionieren.

Dipak Chatterjee
quelle
-3

Wenn Sie verwenden nl2br, werden alle Vorkommen von \nund \rdurch ersetzt <br>. Aber wenn Sie (ich weiß nicht, wie es ist) immer noch neue Zeilen erhalten, können Sie diese verwenden

str_replace("\r","",$description);
str_replace("\n","",$description);

unnötige neue Zeilen durch eine leere Zeichenfolge zu ersetzen.

Evgeniy Skulditsky
quelle
2
Sie werden nicht ersetzt
Brock Hensley
\rin str_replacescheint alles zu ersetzen. Und außerdem sollten Sie es ersetzen durch <br>...
Willem Van Onsem