Come posso sostituire tutte le interruzioni di riga in una stringa con elementi <br />?


536

Come posso leggere l'interruzione di riga da un valore con JavaScript e sostituire tutte le interruzioni di riga con <br />elementi?

Esempio:

Una variabile passata da PHP come di seguito:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Vorrei che il mio risultato fosse simile a questo dopo che lo ha convertito JavaScript:

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

1
Qualcosa non va nella tua domanda originale? stackoverflow.com/questions/784313/...
harto

1
Puoi anche fare nl2br ($ string) in PHP prima di inviarlo a JavaScript.
alex

1
Voterò per chiudere la domanda precedente, poiché questo ha un esempio migliore.
mancanza di palpebre

2
Dovrebbe quindi modificare la domanda iniziale
nickf

Sono venuto qui da una comprensione sbagliata a quello che stava succedendo con .text (). Vedi stackoverflow.com/q/35238362/1467396 se è quello che stai facendo anche tu
David

Risposte:


1202

Ciò trasformerà tutti i ritorni in HTML

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

Nel caso ti chiedi cosa?: Significa. Si chiama un gruppo non di acquisizione. Significa che il gruppo di regex tra parentesi non verrà salvato in memoria per essere referenziato in seguito. Puoi consultare questi thread per ulteriori informazioni:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169


77
Solo una nota aggiuntiva: str.replace("\n", '<br />')(il primo argomento è una stringa normale) sostituirà solo la prima occorrenza.
Serge S.

19
Un'altra versione (per sostituire più interruzioni di riga): str.replace (/ (\ n) + / g, '<br />');
Ritesh

4
@SergeS. Grazie per quel commento extra. Mi ha appena risparmiato un sacco di tempo! jsfiddle
EleventyOne

4
@SergeS., Obbliga il String#replacesuo primo argomento Stringa RegExpun'istanza con escape , senza flag. str.replace('\n', '<br />');è equivalente astr.replace(new RegExp('\n'), '<br />');
palpebra

2
Ecco un test case rispetto a str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx sembra leggermente più veloce
Aley

391

Se la tua preoccupazione è solo la visualizzazione di interruzioni di riga, puoi farlo con CSS.

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

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

Nota : prestare attenzione alla formattazione e al rientro del codice, poiché white-space: pre-linevisualizzerà tutte le nuove righe (tranne l'ultima riga successiva al testo, vedere violino).


59
Ottima risposta ... ha bisogno di più upboat!
Ian Quigley,

11
Sono venuto qui alla ricerca del regex e me ne sono andato. In molte occasioni questo è ciò che la gente sta cercando. Usiamo le interruzioni di riga per le e-mail e, a volte, dobbiamo visualizzare l'aspetto dell'email in html. Perfecto. Grazie per aver esaminato la domanda sotto un'altra luce
Mutmatt

1
Questo potrebbe funzionare per le interruzioni di riga effettive, ma cosa succede se ho "\ n" come nella domanda? Posso risolvere anche questo tramite CSS?
Froxx,

18
Invece di white-space: pre-wrap;preferisco usare white-space: pre-line;(per non aggiungere una linea di interruzione finale dopo tutto)
jpmottin

5
sembra buono ma che dire di uno spazio gigante prima della prima riga? weird
Toolkit

71

Senza regex:

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

2
Se fai "\\ n" eviterai problemi con la divisione solo sulla "n".
CrowderSoup

10
@CrowderSoup hmm? L'ho appena provato e \\nnon corrisponde a una nuova riga, perché sta cercando backslash+ n.
paulslater19,

1
Ho fatto un caso di prova. RegEx è leggermente più veloce, ma controlla tu stesso jsperf.com/split-join-vs-replace-regex
Aley

Ho trovato che questa risposta non funzionava a meno che la barra non fosse sfuggita. Ad esempio: str = str.split ("\ n"). Join ("<br />");
ACOMIT001,

@ ACOMIT001 Immagino che dipenda se la stringa ha una nuova riga o una barra nera e n?
paulslater19,


8

Se la risposta accettata non funziona correttamente per te, potresti provare.

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

Ha funzionato per me.


2
new RegExp('\n', 'g')è identico a /\n/g(ad eccezione di alcune minuzie sull'uso dei letterali primitivi rispetto ai loro costruttori).
mancanza di palpebre

2
qualunque sia la ragione, questo ha funzionato per me, ma la risposta accettata no
nick

1
Ah, lo stesso qui ... ma il mio errore stava tentando di specificare /\n/gcome stringa!
Daniel Fortunov,

7

Indipendentemente dal sistema:

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

1
Attenzione: questo aggiungerà un tag '<br>' a qualsiasi stringa, indipendentemente dal fatto che ci sia un '\ n' in esso.
mkoeller,

4

È anche importante codificare il resto del testo per proteggere da possibili attacchi di iniezione di script

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

Questo ha funzionato per me quando il valore è venuto da un TextBox:

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

2

Per quelli di voi che vogliono solo consentire max. 2 <br>di fila, puoi usare questo:

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

Prima riga: cerca \nOR \r\ndove almeno 2 di essi sono in fila, ad es \n\n\n\n. Quindi sostituirlo con 2br

Seconda riga: cercare tutti i singoli \r\no \nsostituirli con<br>


1

se invii la variabile da PHP, puoi ottenerla prima di inviare:

$string=nl2br($string);

0

Sostituirà tutte le nuove linee con interruzioni

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

Se si desidera sostituire tutte le nuove linee con una singola linea di interruzione

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

Maggiori informazioni su Regex: https://dl.icewarp.com/online_help/203030104.htm questo ti aiuterà ogni volta.


È anche possibile usare una regex come questa str = str.replace(/\n+/g, '<br>')per il secondo caso
Matteo Basso,

0

Non rispondere alla domanda specifica, ma sono sicuro che questo aiuterà qualcuno ...

Se hai un output da PHP che vuoi renderizzare su una pagina web usando JavaScript (forse il risultato di una richiesta Ajax) e vuoi solo conservare spazi bianchi e interruzioni di riga, considera solo di racchiudere il testo all'interno di un <pre></pre>blocco:

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

0

Provare

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>

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.