Bir dizedeki tüm satır sonlarını <br /> öğeleriyle nasıl değiştiririm?


536

JavaScript ile bir değerden satır sonunu nasıl okuyabilir ve tüm satır sonlarını <br />öğelerle nasıl değiştirebilirim ?

Misal:

PHP'den aşağıdaki gibi geçen bir değişken:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

JavaScript dönüştürdükten sonra sonucumun böyle bir şey görünmesini istiyorum:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."

1
Orijinal sorunuzla ilgili bir sorun mu var? stackoverflow.com/questions/784313/…
harto

1
JavaScript'e göndermeden önce PHP'de nl2br ($ string) de yapabilirsiniz.
alex

1
Daha iyi bir örneği olduğu için önceki soruyu kapatmak için oy kullanacağım.
eyelidlessness

2
O zaman ilk soruyu düzenlemelidir
nickf

Buraya yanlış yönlendirilmiş bir anlayıştan .text () ile olan bitene kadar geldim. Bkz stackoverflow.com/q/35238362/1467396 bu da yaptığın buysa
David

Yanıtlar:


1202

Bu, tüm iadeleri HTML'ye dönüştürür

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

Merak ediyorsanız?: Anlamı. Buna yakalamayan grup denir. Bu, parantez içindeki normal ifade grubunun daha sonra başvurmak üzere belleğe kaydedilmeyeceği anlamına gelir. Daha fazla bilgi için bu konulara göz atabilirsiniz:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169


77
Sadece ek not: str.replace("\n", '<br />')(ilk argüman normal bir dizedir) sadece ilk oluşumun yerini alacaktır.
Serge S.15

19
Başka bir sürüm (birden çok satır sonunu değiştirmek için): str.replace (/ (\ n) + / g, '<br />');
Ritesh

4
@SergeS. Bu ekstra yorum için teşekkürler. Bana bir ton zaman kazandırdı! jsfiddle
EleventyOne

4
@SergeS., String#replaceİlk argümanını bayraksız Stringkaçan bir RegExpörneğe zorlar . str.replace('\n', '<br />');eşdeğerstr.replace(new RegExp('\n'), '<br />');
eyelidlessness

2
İşte str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex ile karşılaştırılan bir test örneği RegEx biraz daha hızlı görünüyor
Aley

390

Endişeniz sadece çizgi çizgileri gösteriyorsa, bunu CSS ile yapabilirsiniz.

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

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

Not : Kod biçimlendirmesine ve girintisine dikkat edin, çünkü tüm yeni satırları white-space: pre-linegösterecektir (metinden sonraki son satır hariç, keman bölümüne bakın).


59
Harika bir cevap ... daha fazla gemiye ihtiyaç var!
Ian Quigley

11
Buraya normal ifadeyi aramaya geldim ve bununla ayrıldım. Birçok durumda insanların aradığı budur. E-postalar için satır aralıkları kullanıyoruz ve bazen e-postanın html'de satır olarak görünmesini göstermemiz gerekiyor. Mükemmel. Soruyu farklı bir ışıkta
incelediğiniz

1
Bu, gerçek satır kesmeleri için işe yarayabilir, ancak soruda "\ n" ifadelerim varsa ne olur? Bunu CSS ile de çözebilir miyim?
Froxx

18
Bunun yerine white-space: pre-wrap;kullanmayı tercih ederim white-space: pre-line;(sonuçta son bir mola çizgisi eklememek için)
jpmottin

5
iyi görünüyor ama ilk satırdan önce dev bir alan ne olacak? garip
Araç Seti

71

Normal ifade olmadan:

str = str.split("\n").join("<br />");

2
"\\ n" yaparsanız, yalnızca "n" üzerine bölünmeyle ilgili sorunlardan kaçınacaksınız.
CrowderSoup

10
@CrowderSoup hmm? Sadece denedim ve \\nyeni bir satırda eşleşmiyor, çünkü backslash+ arıyor n.
paulslater19

1
Bir test davası hazırladım. RegEx biraz daha hızlı, ama kendinize göz atın jsperf.com/split-join-vs-replace-regex
Aley

Ben eğik çizgi kaçtı sürece bu cevap işe yaramadı buldum. Örneğin: str = str.split ("\ n"). Join ("<br />");
ACOMIT001

@ ACOMIT001 Sanırım dize yeni bir çizgi veya bir kara çizgi ve n olup olmadığını bağlıdır?
paulslater19


8

Kabul edilen cevap sizin için uygun değilse, deneyebilirsiniz.

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

Benim için çalıştı.


2
new RegExp('\n', 'g')ile aynıdır /\n/g(ilkel değişmezleri kurucularına karşı kullanma konusundaki bazı minutialar hariç).
göz kapaksızlığı

2
nedeni ne olursa olsun, bu benim için çalıştı ama kabul edilen cevap olmadı
nick

1
Ah, burada da aynı ... ama benim hatam /\n/gbir dize olarak belirlemeye çalışıyordu !
Daniel Fortunov

7

Sistemden bağımsız olarak:

my_multiline_text.replace(/$/mg,'<br>');

1
Dikkat: İçinde '\ n' olmasına bakılmaksızın, herhangi bir dizeye '<br>' etiketi eklenir.
mkoeller

4

Olası komut dosyası enjeksiyon saldırılarından korunmak için metnin geri kalanını kodlamak da önemlidir.

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

Değer bir TextBox'tan geldiğinde bu benim için çalıştı:

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

2

Maksimum izin vermek isteyenler için. <br>Arka arkaya 2 , bunu kullanabilirsiniz:

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

İlk satır: ara \nOR \r\nmesela bunlardan en az 2 üst üste vardır \n\n\n\n. Sonra 2 ile değiştirinbr

İkinci satır: Tüm single'ları arayın \r\nveya \ndeğiştirin<br>


1

değişkeni PHP'den gönderirseniz, göndermeden önce bunu bununla elde edebilirsiniz:

$string=nl2br($string);

0

Tüm yeni satırları mola ile değiştirecek

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

Tüm yeni hattı tek kesme hattıyla değiştirmek istiyorsanız

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

Regex hakkında daha fazla bilgi edinin: https://dl.icewarp.com/online_help/203030104.htm Bu size her zaman yardımcı olacaktır.


str = str.replace(/\n+/g, '<br>')İkinci vaka için böyle bir regex kullanmak da mümkündür
Matteo Basso

0

Belirli bir soruyu cevaplamıyor, ama eminim ki bu birisine yardımcı olacaktır ...

Bir web sayfasında JavaScript kullanarak oluşturmak istediğiniz PHP çıktısı (belki de bir Ajax isteğinin sonucu) varsa ve yalnızca beyaz boşluk ve satır sonlarını korumak istiyorsanız, metni bir <pre></pre> bloğun :

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

0

Deneyin

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.