jQuery mengubah jeda baris ke br (setara nl2br)

109

Saya meminta jQuery mengambil beberapa konten textarea dan memasukkannya ke dalam li.

Saya ingin secara visual mempertahankan jeda baris.

Pasti ada cara yang sangat sederhana untuk melakukan ini ...

gbhall
sumber
Catatan XSS: Jika Anda melakukan ini, sepertinya Anda langsung mencampur input pengguna dan <br/>, yang berarti Anda menampilkan baris baru atau <br/s>, dan karenanya mungkin terbuka untuk serangan XSS , yaitu jika masukan Anda datang dari pengguna lain di situs.
user420667

Jawaban:

163

demo: http://so.devilmaycode.it/jquery-convert-line-breaks-to-br-nl2br-equivalent

function nl2br (str, is_xhtml) {   
    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';    
    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}
Luca Filosofi
sumber
5
Terima kasih, ini berfungsi dengan sempurna. Aneh bagaimana ini bukan fungsi resmi jQuery.
gbhall
4
karena jQuery tidak dimaksudkan untuk menggantikan fungsi javascript asli seperti ganti, itu difokuskan pada rantai pemilih CSS dan akses mudah! mungkin dalam versi yang akan datang ;-)
Luca Filosofi
Hebat. Membantu saya mengatasi masalah dengan IE7 yang tidak mendukung white-space: pre-wrap
Kevin Pauli
Bukankah ekspresi reguler itu berarti jika sebuah baris diakhiri dengan ">" itu tidak akan menambahkan BR? Saya tahu di HTML saya, saya menggunakan & gt; tapi konten buatan pengguna tidak bekerja dengan baik dengan itu ...
Dave Stein
@DaveStein no Saya telah mencoba ini dengan '>' dan '& gt;' dan kedua kali jeda baris ditambahkan. Saya pikir kode fungsi ini pada dasarnya sempurna :)
Jake
91

Anda cukup melakukan:

textAreaContent=textAreaContent.replace(/\n/g,"<br>");
mck89
sumber
Cheers, jenis ini berhasil, kecuali itu akan memperlakukan beberapa baris baru sebagai satu baris.
gbhall
4
Saya telah memperbaruinya dan sekarang menggunakan regexp jadi jika Anda ingin memperlakukan beberapa baris baru sebagai satu br, ubah regexp dengan: / \ n + / g
mck89
Terima kasih. Semoga jawaban Anda bermanfaat bagi seseorang, tetapi fungsi di bawah ini juga berfungsi. Saya merasa agak buruk karena Anda membuat lebih banyak usaha, tetapi suatu fungsi lebih diinginkan.
gbhall
jika Anda mendapatkan kesalahan "x.replace bukan fungsi" maka gunakan x.toString (). ganti
Vörös Amadea
29

Letakkan ini di kode Anda (sebaiknya di pustaka fungsi js umum):

String.prototype.nl2br = function()
{
    return this.replace(/\n/g, "<br />");
}

Pemakaian:

var myString = "test\ntest2";

myString.nl2br();

membuat fungsi prototipe string memungkinkan Anda menggunakan ini pada string apa pun.

jnl
sumber
29

Dengan semangat mengubah rendering daripada mengubah konten , CSS berikut membuat setiap baris baru berperilaku seperti<br> :

white-space: pre;
white-space: pre-line;

Mengapa dua aturan: pre-linehanya memengaruhi baris baru (terima kasih atas petunjuknya, @KevinPauli). IE6-7 dan browser lama lainnya kembali ke yang lebih ekstrim preyang juga menyertakan nowrapdan membuat banyak spasi. Detail tentang ini dan pengaturan lainnya ( pre-wrap) di mozilla dan css-trick (terima kasih @Sablefoste).

Meskipun saya umumnya tidak menyukai kecenderungan SO untuk menebak-nebak pertanyaan daripada menjawabnya, dalam hal ini mengganti baris baru dengan <br>markup dapat meningkatkan kerentanan terhadap serangan injeksi dengan input pengguna yang tidak dicuci. Anda melewati garis merah terang setiap kali Anda mengubah .text()panggilan .html()yang menurut pertanyaan literal harus diselesaikan. (Terima kasih @AlexS untuk menyoroti poin ini.) Meskipun Anda mengesampingkan risiko keamanan pada saat itu, perubahan di masa mendatang dapat tanpa disadari. Sebaliknya, CSS ini memungkinkan Anda untuk mendapatkan jeda baris tanpa markup menggunakan yang lebih aman .text().

Bob Stein
sumber
1
Bergantung pada kasusnya, ini adalah solusi paling sederhana, dan benar-benar menjawab pertanyaan dengan paling baik. Anda juga dapat mempertimbangkan salah satu white-space:opsi lainnya , seperti pre-wrap. Lihat css-tricks.com/almanac/properties/w/whitespace
Sablefoste
Ini benar-benar jawaban terbaik - solusi penggantian string berarti perlu menggunakan .html()untuk mengatur konten, yang pada gilirannya akan memungkinkan pengguna untuk memasukkan HTML sewenang-wenang kecuali Anda memfilternya terlebih dahulu.
Alex S
Poin bagus tentang .html()bahaya @AlexS, coba masukkan.
Bob Stein
2

Larutan

Gunakan kode ini

jQuery.nl2br = function(varTest){
  return varTest.replace(/(\r\n|\n\r|\r|\n)/g, "<br>");
};
Ata ul Mustafa
sumber
1

Fungsi JavaScript ini mempertimbangkan apakah akan menggunakan insert atau replace untuk menangani swap.

(Sisipkan atau ganti jeda baris HTML)

/**
 * This function is same as PHP's nl2br() with default parameters.
 *
 * @param {string} str Input text
 * @param {boolean} replaceMode Use replace instead of insert
 * @param {boolean} isXhtml Use XHTML 
 * @return {string} Filtered text
 */
function nl2br (str, replaceMode, isXhtml) {

  var breakTag = (isXhtml) ? '<br />' : '<br>';
  var replaceStr = (replaceMode) ? '$1'+ breakTag : '$1'+ breakTag +'$2';
  return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, replaceStr);
}

Demo - JSFiddle

Fungsi JavaScript nl2br & br2nl

Nick Tsai
sumber
1

Saya menulis sedikit ekstensi jQuery untuk ini:

$.fn.nl2brText = function (sText) {
    var bReturnValue = 'undefined' == typeof sText;
    if(bReturnValue) {
        sText = $('<pre>').html(this.html().replace(/<br[^>]*>/i, '\n')).text();
    }
    var aElms = [];
    sText.split(/\r\n|\r|\n/).forEach(function(sSubstring) {
        if(aElms.length) {
            aElms.push(document.createElement('br'));
        }
        aElms.push(document.createTextNode(sSubstring));
    });
    var $aElms = $(aElms);
    if(bReturnValue) {
        return $aElms;
    }
    return this.empty().append($aElms);
};
Andreas Otto
sumber
0

untuk memperbaiki jawaban yang diterima @Luca Filosofi,

jika diperlukan, mengubah klausa awal regex ini menjadi /([^>[\s]?\r\n]?)juga akan memasukkan kasus di mana baris baru muncul setelah tag DAN beberapa spasi, bukan hanya tag yang langsung diikuti oleh baris baru

phlare
sumber
0

Cara lain untuk menyisipkan teks dari textarea di DOM dengan mempertahankan jeda baris adalah dengan menggunakan properti Node.innerText yang merepresentasikan konten teks yang dirender dari sebuah node dan turunannya.

Sebagai pengambil, itu mendekati teks yang akan didapat pengguna jika mereka menyorot konten elemen dengan kursor dan kemudian disalin ke clipboard.

Properti ini menjadi standar pada tahun 2016 dan didukung dengan baik oleh browser modern. Dapatkah Saya Menggunakan : 97% cakupan global ketika saya memposting jawaban ini.

Volo
sumber