Bagaimana cara mengganti semua jeda baris dalam string dengan elemen <br />?

536

Bagaimana saya bisa membaca jeda baris dari nilai dengan JavaScript dan mengganti semua jeda baris dengan <br />elemen?

Contoh:

Variabel lulus dari PHP seperti di bawah ini:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Saya ingin hasil saya terlihat seperti ini setelah JavaScript mengubahnya:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."
Jin Yong
sumber
1
Ada yang salah dengan pertanyaan awal Anda? stackoverflow.com/questions/784313/…
harto
1
Anda juga bisa melakukan nl2br ($ string) dalam PHP sebelum mengirimnya ke JavaScript.
Alex
1
Saya akan memilih untuk menutup pertanyaan sebelumnya, karena ini memiliki contoh yang lebih baik.
kelopak mata
2
Dia harus mengedit pertanyaan awal kemudian
nickf
Saya datang ke sini dari pemahaman yang salah arah terhadap apa yang sedang terjadi dengan .text (). Lihat stackoverflow.com/q/35238362/1467396 jika itu yang Anda lakukan juga
David

Jawaban:

1202

Ini akan mengubah semua pengembalian menjadi HTML

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

Jika Anda bertanya-tanya apa?: Artinya. Ini disebut grup yang tidak menangkap. Ini berarti bahwa grup regex di dalam tanda kurung tidak akan disimpan dalam memori untuk direferensikan nanti. Anda dapat memeriksa utas ini untuk informasi lebih lanjut:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169

kelopak mata
sumber
77
Hanya catatan tambahan: str.replace("\n", '<br />')(argumen pertama adalah string biasa) akan menggantikan hanya kejadian pertama.
Serge S.
19
Versi lain (untuk mengganti beberapa jeda baris): str.replace (/ (\ n) + / g, '<br />');
Ritesh
4
@SergeS. Terima kasih atas komentar ekstra itu. Baru saja menyelamatkan saya TONNE waktu! jsfiddle
EleventyOne
4
@SergeS., Memaksakan String#replaceargumen pertamanya dari Stringke RegExpinstance yang lolos , tanpa tanda. str.replace('\n', '<br />');setara denganstr.replace(new RegExp('\n'), '<br />');
kelopak mata
2
Berikut ini adalah contoh kasus dibandingkan dengan str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx tampaknya sedikit lebih cepat
Aley
391

Jika kekhawatiran Anda hanya menampilkan linebreak, Anda bisa melakukannya dengan CSS.

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

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

Catatan : Perhatikan pemformatan dan indentasi kode, karena white-space: pre-lineakan menampilkan semua baris baru (kecuali baris baru terakhir setelah teks, lihat biola).

bersling
sumber
59
Jawaban yang bagus ... membutuhkan lebih banyak perahu!
Ian Quigley
11
Saya datang ke sini mencari regex dan pergi dengan ini. Dalam banyak kesempatan inilah yang dicari orang. Kami menggunakan linebreak untuk surel dan terkadang perlu menampilkan apa yang tampak garis surel dalam html. Perfecto. Terima kasih telah melihat pertanyaan dengan cara yang berbeda
Mutmatt
1
Ini mungkin berfungsi untuk jeda baris aktual, tetapi bagaimana jika saya memiliki "\ n" seperti dalam pertanyaan? Bisakah saya menyelesaikan ini dengan CSS juga?
Froxx
18
Alih-alih white-space: pre-wrap;saya lebih suka menggunakan white-space: pre-line;(untuk tidak menambahkan garis istirahat akhir setelah semua)
jpmottin
5
terlihat bagus tapi bagaimana dengan ruang raksasa sebelum baris pertama? aneh
Toolkit
71

Tanpa regex:

str = str.split("\n").join("<br />");
paulslater19
sumber
2
Jika Anda melakukan "\\ n" Anda akan menghindari masalah dengan pemisahan hanya pada "n".
CrowderSoup
10
@CrowderSoup hmm? Saya baru saja mencobanya dan \\ntidak cocok dengan baris baru, karena sedang mencari backslash+ n.
paulslater19
1
Saya membuat test case. RegEx sedikit lebih cepat, tetapi periksa sendiri jsperf.com/split-join-vs-replace-regex
Aley
Saya menemukan jawaban ini tidak berfungsi kecuali tebasan itu lolos. Sebagai contoh: str = str.split ("\ n"). Join ("<br />");
ACOMIT001
@ ACOMIT001 Saya kira itu tergantung apakah string memiliki baris baru atau blackslash dan n?
paulslater19
38

Ini berfungsi untuk input yang berasal dari textarea

str.replace(new RegExp('\r?\n','g'), '<br />');
WSkinner
sumber
1
Ini jawaban terbaik bagi saya karena Anda tidak melupakan \ r, yang digunakan pada beberapa sistem
Bartłomiej Zalewski
1
Ini adalah jawaban terbaik untuk pertanyaan ini. Tapi saya hanya akan pergi dengan Situs tidak <br />. Lihat ini stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya
8

Jika jawaban yang diterima tidak berfungsi untuk Anda, maka Anda dapat mencoba.

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

Ini berhasil untuk saya.

Jethro Larson
sumber
2
new RegExp('\n', 'g')identik dengan /\n/g(kecuali untuk beberapa hal kecil tentang penggunaan literal primitif versus konstruktornya).
kelopak mata
2
apa pun alasannya, ini berhasil bagi saya tetapi jawaban yang diterima tidak
nick
1
Ah, sama di sini ... tetapi kesalahan saya mencoba untuk menentukan /\n/gsebagai string!
Daniel Fortunov
7

Terlepas dari sistem:

my_multiline_text.replace(/$/mg,'<br>');
Michele Ongaro
sumber
1
Perhatian: Ini akan menambahkan tag '<br>' ke string apa pun, terlepas dari apakah ada '\ n' di dalamnya.
mkoeller
4

Penting juga untuk menyandikan sisa teks untuk melindungi dari kemungkinan serangan injeksi skrip

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
sumber
4

Ini bekerja untuk saya ketika nilai berasal dari TextBox:

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

Bagi Anda yang hanya ingin memperbolehkan maks. 2 <br>berturut-turut, Anda dapat menggunakan ini:

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

Baris pertama: Cari \nATAU \r\ndi mana setidaknya 2 dari mereka berturut-turut, misalnya \n\n\n\n. Kemudian gantilah dengan 2br

Baris kedua: Cari semua \r\natau \nganti dengan<br>

Maks
sumber
1

jika Anda mengirim variabel dari PHP, Anda bisa mendapatkannya dengan ini sebelum mengirim:

$string=nl2br($string);
Luca C.
sumber
0

Itu akan mengganti semua baris baru dengan break

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

Jika Anda ingin mengganti semua baris baru dengan satu baris break

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

Baca lebih lanjut tentang Regex: https://dl.icewarp.com/online_help/203030104.htm ini akan membantu Anda setiap saat.

Ritu Gupta
sumber
Dimungkinkan juga untuk menggunakan regex seperti ini str = str.replace(/\n+/g, '<br>')untuk kasus kedua
Matteo Basso
0

Tidak menjawab pertanyaan spesifik, tetapi saya yakin ini akan membantu seseorang ...

Jika Anda memiliki output dari PHP yang ingin Anda render di halaman web menggunakan JavaScript (mungkin hasil dari permintaan Ajax), dan Anda hanya ingin mempertahankan spasi putih dan pemisah baris, pertimbangkan untuk menyertakan teks di dalam <pre></pre>blok:

var text_with_line_breaks = retrieve_some_text_from_php();
var element = document.querySelectorAll('#output');
element.innerHTML = '<pre>' + text_with_line_breaks + '</pre>';
osullis
sumber
0

Mencoba

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
sumber