¿Cómo reemplazo todos los saltos de línea en una cadena con elementos <br />?

536

¿Cómo puedo leer el salto de línea de un valor con JavaScript y reemplazar todos los saltos de línea con <br /> elementos?

Ejemplo:

Una variable pasada de PHP como se muestra a continuación:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Me gustaría que mi resultado se vea así después de que JavaScript lo convierta:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."
Jin Yong
fuente
1
Algo mal con tu pregunta original? stackoverflow.com/questions/784313/…
harto
1
También puede hacer nl2br ($ string) en PHP antes de enviarlo a JavaScript.
alex
1
Voy a votar para cerrar la pregunta anterior, ya que este tiene un mejor ejemplo.
párpado
2
Debería editar la pregunta inicial entonces
nickf
Vine aquí desde una comprensión equivocada de lo que estaba pasando con .text (). Ver stackoverflow.com/q/35238362/1467396 si eso es lo que está haciendo, también
David

Respuestas:

1202

Esto convertirá todos los retornos en HTML

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

En caso de que te preguntes qué ?: significa. Se llama un grupo sin captura. Significa que el grupo de expresiones regulares dentro de los paréntesis no se guardará en la memoria para que se haga referencia más adelante. Puede consultar estos hilos para obtener más información:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169

sin párpados
fuente
77
Solo una nota adicional: str.replace("\n", '<br />')(el primer argumento es una cadena regular) reemplazará solo la primera aparición.
Serge S.
19
Otra versión (para reemplazar saltos de línea múltiples): str.replace (/ (\ n) + / g, '<br />');
Ritesh
44
@SergeS. Gracias por ese comentario extra. ¡Acabo de salvarme una TONELADA de tiempo! jsfiddle
EleventyOne
44
@SergeS., String#replaceCoacciona su primer argumento desde Stringuna RegExpinstancia escapada , sin banderas. str.replace('\n', '<br />');es equivalente astr.replace(new RegExp('\n'), '<br />');
eyelidlessness
2
Aquí hay un caso de prueba en comparación con str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx parece un poco más rápido
Aley
391

Si su preocupación es solo mostrar saltos de línea, puede hacerlo con CSS.

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

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

Nota : Preste atención al formateo y sangría del código, ya white-space: pre-lineque mostrará todas las líneas nuevas (excepto la última línea nueva después del texto, ver violín).

bersling
fuente
59
Gran respuesta ... necesita más botes!
Ian Quigley
11
Vine aquí buscando la expresión regular y me fui con esto. En muchas ocasiones, esto es lo que la gente está buscando. Usamos saltos de línea para correos electrónicos y, a veces, necesitamos mostrar lo que parecía el correo electrónico en html. Perfecto Gracias por mirar la pregunta desde otra
perspectiva
1
Esto podría funcionar para saltos de línea reales, pero ¿qué pasa si tengo "\ n" como en la pregunta? ¿Puedo resolver esto también mediante CSS?
Froxx
18
En lugar de white-space: pre-wrap;preferir el uso white-space: pre-line;(para no agregar una línea de
corte
55
se ve bien, pero ¿qué pasa con un espacio gigante antes de la primera línea? raro
Toolkit
71

Sin expresiones regulares:

str = str.split("\n").join("<br />");
paulslater19
fuente
2
Si haces "\\ n", evitarás problemas al dividir solo la "n".
CrowderSoup
10
@CrowderSoup hmm? Acabo de probarlo y \\nno coincide en una nueva línea, porque está buscando backslash+ n.
paulslater19
1
Hice un caso de prueba. RegEx es un poco más rápido, pero compruébelo usted mismo jsperf.com/split-join-vs-replace-regex
Aley
Encontré que esta respuesta no funcionaba a menos que la barra se escapara. Por ejemplo: str = str.split ("\ n"). Join ("<br />");
ACOMIT001
@ ACOMIT001 Supongo que eso depende de si la cadena tiene una nueva línea o una barra negra yn?
paulslater19
38

Esto funciona para entradas provenientes de un área de texto

str.replace(new RegExp('\r?\n','g'), '<br />');
WSkinner
fuente
1
Es la mejor respuesta para mí porque no olvidaste el \ r, que se usa en algunos sistemas
Bartłomiej Zalewski
1
Esta es la mejor respuesta para esta pregunta. Pero simplemente iré con <br> no <br />. Vea este stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya
8

Si la respuesta aceptada no funciona bien para usted, entonces puede intentarlo.

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

Funcionó para mi.

Jethro Larson
fuente
2
new RegExp('\n', 'g')es idéntico a /\n/g(a excepción de algunas minucias sobre el uso de literales primitivos frente a sus constructores).
párpado
2
cualquiera sea la razón, esto funcionó para mí, pero la respuesta aceptada no lo hizo
nick
1
Ah, lo mismo aquí ... ¡pero mi error fue intentar especificar /\n/gcomo una cadena!
Daniel Fortunov
7

Independientemente del sistema:

my_multiline_text.replace(/$/mg,'<br>');
Michele Ongaro
fuente
1
Precaución: Esto agregará una etiqueta '<br>' a cualquier cadena, independientemente de si hay un '\ n' en ella.
mkoeller
4

También es importante codificar el resto del texto para protegerse de posibles ataques de inyección 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
fuente
4

Esto funcionó para mí cuando el valor vino de un TextBox:

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

Para aquellos de ustedes que solo quieren permitir max. 2 <br>seguidos, puedes usar esto:

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

Primera línea: busque \nOR \r\ndonde al menos 2 de ellos están en una fila, por ejemplo \n\n\n\n. Luego reemplácelo con 2br

Segunda línea: busque todos los únicos \r\no \nreemplácelos por<br>

Max
fuente
1

si envía la variable desde PHP, puede obtenerla con esto antes de enviar:

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

Reemplazará toda línea nueva con descanso

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

Si desea reemplazar todas las líneas nuevas con una sola línea de corte

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

Lea más sobre Regex: https://dl.icewarp.com/online_help/203030104.htm esto lo ayudará en todo momento.

Ritu Gupta
fuente
También es posible utilizar una expresión regular como esta str = str.replace(/\n+/g, '<br>')para el segundo caso
Matteo Basso
0

No respondo la pregunta específica, pero estoy seguro de que esto ayudará a alguien ...

Si tiene una salida de PHP que desea representar en una página web usando JavaScript (quizás el resultado de una solicitud de Ajax), y solo desea retener espacios en blanco y saltos de línea, considere encerrar el texto dentro de un <pre></pre>bloque:

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

Tratar

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
fuente