Jak zastąpić wszystkie podziały wiersza w łańcuchu elementami <br />?

536

Jak mogę odczytać podział wiersza z wartości za pomocą JavaScript i zastąpić wszystkie podziały wiersza <br />elementami?

Przykład:

Zmienna przekazana z PHP jak poniżej:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Chciałbym, aby mój wynik wyglądał tak po konwersji JavaScript:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."
Jin Yong
źródło
1
Coś nie tak z twoim pierwotnym pytaniem? stackoverflow.com/questions/784313/…
harto
1
Możesz także zrobić nl2br ($ string) w PHP przed wysłaniem go do JavaScript.
alex
1
Głosuję za zamknięciem wcześniejszego pytania, ponieważ ma to lepszy przykład.
powiek
2
Powinien wtedy edytować początkowe pytanie
nick
Przyszedłem tutaj od błędnego zrozumienia do tego, co się działo z .text (). Zobacz też stackoverflow.com/q/35238362/1467396, jeśli to właśnie robisz
David

Odpowiedzi:

1202

Spowoduje to przekształcenie wszystkich zwrotów w HTML

str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');

Jeśli zastanawiasz się, co?: Oznacza. Nazywa się to grupą nie przechwytującą. Oznacza to, że grupa wyrażeń regularnych w nawiasach nie zostanie zapisana w pamięci, do której można będzie się później odwoływać. Możesz sprawdzić te wątki, aby uzyskać więcej informacji:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169

brak powiek
źródło
77
Tylko dodatkowa uwaga: str.replace("\n", '<br />')(pierwszy argument jest ciągiem zwykłym) zastąpi tylko pierwsze wystąpienie.
Serge S.
19
Inna wersja (w celu zastąpienia wielu podziałów wiersza): str.replace (/ (\ n) + / g, '<br />');
Ritesh
4
@SergeS. Dzięki za ten dodatkowy komentarz. Właśnie zaoszczędziłem TONĘ czasu! jsfiddle
EleventyOne
4
@SergeS., Zmusza String#replaceswój pierwszy argument Stringdo uciekającej RegExpinstancji, bez flag. str.replace('\n', '<br />');jest równoznaczne zstr.replace(new RegExp('\n'), '<br />');
powiek
2
Oto przypadek testowy w porównaniu do str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx wydaje się nieco szybszy
Aley
390

Jeśli Twoim zmartwieniem jest wyświetlanie przełamań linii, możesz to zrobić za pomocą CSS.

<div style="white-space: pre-line">Some test
with linebreaks</div>

Jsfiddle: https://jsfiddle.net/5bvtL6do/2/

Uwaga : Zwróć uwagę na formatowanie i wcięcie kodu, ponieważ white-space: pre-linewyświetli się wszystkie nowe wiersze (z wyjątkiem ostatniego nowego wiersza po tekście, patrz skrzypce).

bersling
źródło
59
Świetna odpowiedź ... potrzebuje więcej upboats!
Ian Quigley,
11
Przyszedłem tutaj, szukając wyrażenia regularnego i wyszedłem z tym. W wielu przypadkach ludzie tego szukają. Do wiadomości e-mail używamy podziałów linii i czasami musimy wyświetlać w html to, co wyglądało na e-maila. Perfecto Dzięki za spojrzenie na pytanie w innym świetle
Mutmatt
1
Może to działać dla faktycznych podziałów linii, ale co, jeśli mam „\ n” jak w pytaniu? Czy mogę to rozwiązać również za pomocą CSS?
Froxx
18
Zamiast white-space: pre-wrap;wolę używać white-space: pre-line;(nie dodawać w końcu ostatniej linii podziału)
jpmottin,
5
wygląda dobrze, ale co z gigantyczną przestrzenią przed pierwszą linią? dziwne
zestaw narzędzi
71

Bez wyrażenia regularnego:

str = str.split("\n").join("<br />");
paulslater19
źródło
2
Jeśli zrobisz „\\ n”, unikniesz problemów z podziałem tylko na „n”.
CrowderSoup,
10
@CrowderSoup hmm? Właśnie go wypróbowałem i \\nnie pasuje do nowej linii, ponieważ szuka backslash+ n.
paulslater19
1
Zrobiłem przypadek testowy. RegEx jest nieco szybszy, ale sprawdź sam. Jsperf.com/split-join-vs-replace-regex
Aley
Przekonałem się, że ta odpowiedź nie zadziała, chyba że ukośnik zostanie uniknięty. Na przykład: str = str.split („\ n”). Join („<br />”);
ACOMIT001
@ ACOMIT001 Wydaje mi się, że zależy to od tego, czy ciąg ma nową linię, czy czarny ukośnik i n?
paulslater19
38

Działa to w przypadku danych wejściowych z obszaru tekstowego

str.replace(new RegExp('\r?\n','g'), '<br />');
WSkinner
źródło
1
To dla mnie najlepsza odpowiedź, ponieważ nie zapomniałeś o tym, który jest używany w niektórych systemach
Bartłomiej Zalewski,
1
To najlepsza odpowiedź na to pytanie. Ale po prostu pójdę z <br> nie <br />. Zobacz ten stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya
8

Jeśli zaakceptowana odpowiedź nie jest dla Ciebie odpowiednia, możesz spróbować.

str.replace(new RegExp('\n','g'), '<br />')

To zadziałało dla mnie.

Jethro Larson
źródło
2
new RegExp('\n', 'g')jest identyczny z /\n/g(z wyjątkiem kilku drobiazgów na temat używania prymitywnych literałów w porównaniu z ich konstruktorami).
powiek
2
bez względu na przyczynę, zadziałało to dla mnie, ale zaakceptowana odpowiedź nie zadziałała
nick
1
Ach, to samo tutaj ... ale mój błąd polegał na próbie określenia /\n/gjako ciąg!
Daniel Fortunov,
7

Niezależnie od systemu:

my_multiline_text.replace(/$/mg,'<br>');
Michele Ongaro
źródło
1
Uwaga: to doda tag „<br>” do dowolnego ciągu, niezależnie od tego, czy jest w nim „\ n”.
mkoeller
4

Ważne jest również zakodowanie pozostałej części tekstu, aby zabezpieczyć się przed możliwymi atakami skryptowymi

function insertTextWithLineBreaks(text, targetElement) {
    var textWithNormalizedLineBreaks = text.replace('\r\n', '\n');
    var textParts = textWithNormalizedLineBreaks.split('\n');

    for (var i = 0; i < textParts.length; i++) {
        targetElement.appendChild(document.createTextNode(textParts[i]));
        if (i < textParts.length - 1) {
            targetElement.appendChild(document.createElement('br'));
        }
    }
}
Dmitry Dzygin
źródło
4

To działało dla mnie, gdy wartość pochodziła z TextBox:

string.replace(/\n|\r\n|\r/g, '<br/>');
Dr Aaron Dishno
źródło
2

Dla tych z Was, którzy chcą tylko pozwolić na maks. 2 <br>z rzędu możesz użyć tego:

let text = text.replace(/(\r?\n){2,}/g, '<br><br>');
text = text.replace(/(\r?\n)/g, '<br>');

Pierwszy wiersz: wyszukaj \nOR, \r\ngdzie przynajmniej 2 z nich są w rzędzie, np \n\n\n\n. Następnie zamień na 2br

Drugi wiersz: Wyszukaj wszystkie pojedyncze \r\nlub \nzamień je na<br>

Max
źródło
1

jeśli wysyłasz zmienną z PHP, możesz ją uzyskać w ten sposób przed wysłaniem:

$string=nl2br($string);
Luca C.
źródło
0

Zastąpi całą nową linię łamaniem

str = str.replace(/\n/g, '<br>')

Jeśli chcesz zastąpić całą nową linię pojedynczą linią przerwania

str = str.replace(/\n*\n/g, '<br>')

Przeczytaj więcej o Regex: https://dl.icewarp.com/online_help/203030104.htm, to pomoże Ci za każdym razem.

Ritu Gupta
źródło
Możliwe jest również użycie takiego wyrażenia regularnego str = str.replace(/\n+/g, '<br>')w drugim przypadku
Matteo Basso
0

Nie odpowiadam na konkretne pytanie, ale jestem pewien, że to pomoże komuś ...

Jeśli masz dane wyjściowe z PHP, które chcesz wyrenderować na stronie internetowej za pomocą JavaScript (być może w wyniku żądania Ajax), a chcesz po prostu zachować białe znaki i podziały wierszy, rozważ umieszczenie tekstu w <pre></pre>bloku:

var text_with_line_breaks = retrieve_some_text_from_php();
var element = document.querySelectorAll('#output');
element.innerHTML = '<pre>' + text_with_line_breaks + '</pre>';
osullic
źródło
0

Próbować

let s=`This is man.

     Man like dog.
     Man like to drink.

     Man is the king.`;
     
msg.innerHTML = s.replace(/\n/g,"<br />");
<div id="msg"></div>

Kamil Kiełczewski
źródło