jQuery converte le interruzioni di riga in br (equivalente nl2br)


109

Sto facendo in modo che jQuery prenda del contenuto di textarea e lo inserisca in un li.

Voglio che mantenga visivamente le interruzioni di riga.

Ci deve essere un modo molto semplice per farlo ...


Nota XSS: se lo fai, sembra che tu stia mescolando direttamente l'input dell'utente e gli <br/>, il che significa che stai visualizzando le nuove righe o le <br/s> e quindi potresti essere aperto agli attacchi XSS , ovvero se il tuo input proviene da qualsiasi altro utente del sito.
user420667

Risposte:


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

5
Grazie, funziona perfettamente. Strano come questa non sia una funzione ufficiale di jQuery.
gbhall

4
poiché jQuery non intende sostituire la funzione javascript nativa come la sostituzione, è focalizzata sul concatenamento dei selettori CSS e un facile accesso! magari in versione futura ;-)
Luca Filosofi

Eccezionale. Mi ha aiutato a superare il problema con IE7 che non supportava gli spazi bianchi: pre-wrap
Kevin Pauli

Quella regex non significherebbe che se una riga finisce con ">" non aggiungerebbe BR? So che nel mio codice HTML utilizzo & gt; ma il contenuto generato dall'utente non funziona così bene con quello ...
Dave Stein

@DaveStein no, l'ho provato sia con '>' che con '& gt;' ed entrambe le volte vengono aggiunte le interruzioni di riga. Penso che questo codice funzione sia fondamentalmente perfetto :)
Jake

91

puoi semplicemente fare:

textAreaContent=textAreaContent.replace(/\n/g,"<br>");

Salute, questo tipo di lavoro ha funzionato, tranne che tratterebbe più interruzioni di riga come una singola interruzione di riga.
gbhall

4
L'ho aggiornato e ora usa una regexp quindi se vuoi trattare più interruzioni di riga come un singolo br cambia la regexp con: / \ n + / g
mck89

Grazie. Si spera che qualcuno trovi utile la tua risposta, ma anche la funzione seguente funziona. Mi dispiace che tu stia facendo più sforzi, ma una funzione è più desiderabile.
gbhall

se ricevi l'errore "x.replace non è una funzione", usa x.toString (). replace
Vörös Amadea

29

Inseriscilo nel tuo codice (preferibilmente in una libreria di funzioni js generale):

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

Uso:

var myString = "test\ntest2";

myString.nl2br();

la creazione di una funzione di prototipo di stringa consente di utilizzarla su qualsiasi stringa.


29

Nello spirito di cambiare il rendering invece di cambiare il contenuto , il seguente CSS fa sì che ogni nuova riga si comporti come un<br> :

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

Perché due regole: pre-lineinfluisce solo sulle nuove righe (grazie per l'indizio, @KevinPauli). IE6-7 e altri vecchi browser tornano all'estremo preche include nowrape rende anche più spazi. Dettagli su queste e altre impostazioni ( pre-wrap) su mozilla e css-tricks (grazie @Sablefoste).

Anche se sono generalmente contrario alla predilezione SO per indovinare la domanda piuttosto che rispondere, in questo caso la sostituzione di nuove righe con <br>markup può aumentare la vulnerabilità agli attacchi di iniezione con input dell'utente non lavato. Stai attraversando una linea rossa brillante ogni volta che ti ritrovi a cambiare le .text()chiamate a .html()cui la domanda letterale implica che dovrebbero essere fatte. (Grazie @AlexS per aver evidenziato questo punto.) Anche se al momento escludi un rischio per la sicurezza, modifiche future potrebbero introdurlo involontariamente. Invece, questo CSS ti consente di ottenere interruzioni di riga rigide senza markup utilizzando il più sicuro .text().


1
A seconda dei casi, questa è la soluzione più semplice e risponde davvero meglio alla domanda. Potresti anche considerare una qualsiasi delle altre white-space:opzioni, come pre-wrap. Vedi css-tricks.com/almanac/properties/w/whitespace
Sablefoste

Questa è davvero la risposta migliore: le soluzioni di sostituzione delle stringhe significherebbero la necessità di utilizzare .html()per impostare il contenuto, che a sua volta consentirebbe all'utente di inserire HTML arbitrario a meno che non lo filtri in anticipo.
Alex S

Buon punto sul .html()pericolo @AlexS, ho cercato di incorporare.
Bob Stein

2

Soluzione

Usa questo codice

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

1

Questa funzione JavaScript considera se utilizzare l'inserimento o la sostituzione per gestire lo scambio.

(Inserisci o sostituisci interruzioni di riga 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

Funzioni JavaScript nl2br e br2nl


1

Ho scritto una piccola estensione jQuery per questo:

$.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);
};

0

per migliorare la risposta accettata da @Luca Filosofi,

se necessario, la modifica della clausola di inizio di questa regex in /([^>[\s]?\r\n]?)sarà anche ingerire i casi in cui la nuova riga viene dopo un tag E alcuni spazi bianchi, invece di un tag immediatamente seguito da una nuova riga


0

Un altro modo per inserire testo da un'area di testo nel DOM mantenendo le interruzioni di riga è utilizzare la proprietà Node.innerText che rappresenta il contenuto di testo renderizzato di un nodo e dei suoi discendenti.

Come getter, approssima il testo che l'utente otterrebbe se evidenziasse il contenuto dell'elemento con il cursore e poi lo copiasse negli appunti.

La proprietà è diventata standard nel 2016 ed è ben supportata dai browser moderni. Posso usare : copertura globale del 97% quando ho pubblicato questa risposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.