Como substituo todas as quebras de linha em uma string por elementos <br />?

536

Como posso ler a quebra de linha de um valor com JavaScript e substituir todas as quebras de linha por <br />elementos?

Exemplo:

Uma variável passada do PHP como abaixo:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Gostaria que meu resultado fosse algo assim depois que o JavaScript o converter:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."
Jin Yong
fonte
1
Algo errado com sua pergunta original? stackoverflow.com/questions/784313/…
harto 24/04
1
Você também pode fazer nl2br ($ string) no PHP antes de enviá-lo para JavaScript.
alex
1
Vou votar para encerrar a pergunta anterior, pois esse tem um exemplo melhor.
Eyelidlessness
2
Ele deve editar a pergunta inicial, em seguida
nickf
Eu vim aqui de um entendimento equivocado para o que estava acontecendo com .text (). Veja stackoverflow.com/q/35238362/1467396 se é isso que você está fazendo, também
David

Respostas:

1202

Isso transformará todos os retornos em HTML

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

Caso você queira saber o que?: Significa. É chamado de grupo não capturante. Isso significa que o grupo de regex entre parênteses não será salvo na memória para referência posteriormente. Você pode verificar esses tópicos para obter mais informações:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169

ausência de pálpebra
fonte
77
Apenas uma observação adicional: str.replace("\n", '<br />')(o primeiro argumento é uma sequência regular) substituirá apenas a primeira ocorrência.
Serge S.
19
Outra versão (para substituir várias quebras de linha): str.replace (/ (\ n) + / g, '<br />');
Ritesh
4
@SergeS. Obrigado por esse comentário extra. Apenas me salvou uma tonelada de tempo! jsfiddle
EleventyOne
4
@SergeS., Coage String#replaceseu primeiro argumento de Stringpara uma RegExpinstância de escape , sem sinalizadores. str.replace('\n', '<br />');é equivalente astr.replace(new RegExp('\n'), '<br />');
eyelidlessness
2
Aqui está um caso de teste para comparar str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx parece um pouco mais rápido
Aley
391

Se sua preocupação é apenas exibir quebras de linha, você pode fazer isso com CSS.

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

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

Nota : Preste atenção à formatação e recuo do código, pois white-space: pre-lineexibirá todas as novas linhas (exceto a última nova linha após o texto, consulte violino).

bersling
fonte
59
Ótima resposta ... precisa de mais upboats!
21815 Ian Quigley #
11
Eu vim aqui procurando o regex e saí com isso. Em muitas ocasiões, é isso que as pessoas procuram. Usamos quebras de linha para e-mails e, às vezes, precisamos exibir a aparência do e-mail em HTML. Perfecto. Obrigado por olhar para a questão sob uma luz diferente
Mutmatt
1
Isso pode funcionar para quebras de linha reais, mas e se eu tiver "\ n" como na pergunta? Também posso resolver isso por CSS?
Froxx 24/05
18
Em vez de white-space: pre-wrap;eu prefiro uso white-space: pre-line;(para não adicionar uma linha de ruptura final depois de tudo)
jpmottin
5
parece bom, mas que tal um espaço gigante antes da primeira linha? weird
Toolkit
71

Sem regex:

str = str.split("\n").join("<br />");
paulslater19
fonte
2
Se você fizer "\\ n", evitará problemas com a divisão apenas no "n".
CrowderSoup
10
@CrowderSoup hmm? Eu apenas tentei e \\nnão corresponde a uma nova linha, porque está procurando backslash+ n.
precisa saber é o seguinte
1
Eu fiz um caso de teste. RegEx é um pouco mais rápido, mas verificar por si mesmo jsperf.com/split-join-vs-replace-regex
Aley
Achei que essa resposta não funcionaria, a menos que a barra tivesse escapado. Por exemplo: str = str.split ("\ n"). Join ("<br />");
ACOMIT001
@ ACOMIT001 Acho que depende se a string tem uma nova linha ou uma barra preta e n?
paulslater19
38

Isso funciona para entradas provenientes de uma área de texto

str.replace(new RegExp('\r?\n','g'), '<br />');
WSkinner
fonte
1
É a melhor resposta para mim porque você não esquecer o \ r, que é usado em alguns sistemas
Bartłomiej Zalewski
1
Esta é a melhor resposta para esta pergunta. Mas eu irei apenas com o que não <br />. Veja este stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya
8

Se a resposta aceita não estiver funcionando corretamente para você, tente.

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

Funcionou para mim.

Jethro Larson
fonte
2
new RegExp('\n', 'g')é idêntico a /\n/g(exceto por algumas minúcias sobre o uso de literais primitivos versus seus construtores).
Eyelidlessness
2
seja qual for o motivo, isso funcionou para mim, mas a resposta aceita não
nick
1
Ah, o mesmo aqui ... mas meu erro foi tentar especificar /\n/gcomo uma string!
precisa saber é o seguinte
7

Independentemente do sistema:

my_multiline_text.replace(/$/mg,'<br>');
Michele Ongaro
fonte
1
Cuidado: Isso anexará uma tag '<br>' a qualquer string, independentemente de haver um \ \ n 'nela.
Mkeller #
4

Também é importante codificar o restante do texto para proteger contra possíveis ataques de injeção de 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'));
        }
    }
}
Dmitry Dzygin
fonte
4

Isso funcionou para mim quando o valor veio de um TextBox:

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

Para aqueles que desejam apenas permitir lances máximos 2 <br>em uma linha, você pode usar isto:

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

Primeira linha: pesquise \nOR \r\nonde pelo menos 2 deles estejam seguidos, por exemplo \n\n\n\n. Em seguida, substitua-o por 2br

Segunda linha: pesquise todas as únicas \r\nou \nsubstitua-as por<br>

Máx.
fonte
1

se você enviar a variável do PHP, poderá obtê-la com isso antes de enviar:

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

Substituirá toda a nova linha por quebra

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

Se você deseja substituir toda a nova linha por uma única linha

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

Leia mais sobre o Regex: https://dl.icewarp.com/online_help/203030104.htm, isso ajudará você sempre.

Ritu Gupta
fonte
Também é possível usar uma regex como este str = str.replace(/\n+/g, '<br>')para o segundo caso
Matteo Basso
0

Não estou respondendo a uma pergunta específica, mas tenho certeza de que isso ajudará alguém ...

Se você tiver uma saída do PHP que deseja renderizar em uma página da Web usando JavaScript (talvez o resultado de uma solicitação do Ajax) e apenas queira manter espaço em branco e quebras de linha, considere apenas colocar o texto dentro de um <pre></pre>bloco:

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

Tentar

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
fonte