¿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."

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


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).


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 />");

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


8

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

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

Funcionó para mi.


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

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

4

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

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

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>


1

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

$string=nl2br($string);

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.


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

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.