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."

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


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).


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 />");

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


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.


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>');

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'));
        }
    }
}

4

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

string.replace(/\n|\r\n|\r/g, '<br/>');

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>


1

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

$string=nl2br($string);

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.


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>';

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.