Comment remplacer tous les sauts de ligne d'une chaîne par des éléments <br />?

536

Comment puis-je lire le saut de ligne d'une valeur avec JavaScript et remplacer tous les sauts de ligne par des <br />éléments?

Exemple:

Une variable passée de PHP comme ci-dessous:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

J'aimerais que mon résultat ressemble à ceci après que le JavaScript l'ait converti:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."
Jin Yong
la source
1
Quelque chose ne va pas avec votre question d'origine? stackoverflow.com/questions/784313/…
harto
1
Vous pouvez également faire nl2br ($ string) en PHP avant de l'envoyer à JavaScript.
alex
1
Je vais voter pour clore la question précédente, car celle-ci a un meilleur exemple.
paupières
2
Il devrait alors modifier la question initiale
nickf le
Je suis venu ici d'une compréhension erronée de ce qui se passait avec .text (). Voir stackoverflow.com/q/35238362/1467396 si c'est ce que vous faites aussi
David

Réponses:

1202

Cela transformera tous les retours en HTML

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

Si vous vous demandez quoi?: Signifie. Il s'agit d'un groupe non capturant. Cela signifie que le groupe d'expressions régulières entre parenthèses ne sera pas enregistré en mémoire pour être référencé plus tard. Vous pouvez consulter ces discussions pour plus d'informations:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169

sans paupières
la source
77
Remarque supplémentaire: str.replace("\n", '<br />')(le premier argument est une chaîne régulière) ne remplacera que la première occurrence.
Serge S.
19
Une autre version (pour remplacer plusieurs sauts de ligne): str.replace (/ (\ n) + / g, '<br />');
Ritesh
4
@SergeS. Merci pour ce commentaire supplémentaire. Je viens de gagner une TONNE de temps! jsfiddle
EleventyOne
4
@SergeS., String#replaceContraint son premier argument de Stringà une RegExpinstance d' échappement, sans indicateur. str.replace('\n', '<br />');équivaut àstr.replace(new RegExp('\n'), '<br />');
eyelidlessness
2
Voici un cas de test comparé à str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx semble légèrement plus rapide
Aley
391

Si votre souci est simplement d'afficher des sauts de ligne, vous pouvez le faire avec CSS.

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

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

Remarque : Faites attention au formatage et à l'indentation du code, car white-space: pre-lineaffichera tous les retours à la ligne (sauf le dernier retour à la ligne après le texte, voir violon).

bersling
la source
59
Grande réponse ... a besoin de plus de bateaux up!
Ian Quigley
11
Je suis venu ici à la recherche de l'expression régulière et je suis parti avec ça. Dans de nombreuses occasions, c'est ce que les gens recherchent. Nous utilisons des sauts de ligne pour les e-mails et devons parfois afficher l'aspect de l'e-mail en html. Perfecto. Merci d'avoir regardé la question sous un autre angle
Mutmatt
1
Cela peut fonctionner pour les sauts de ligne réels, mais que se passe-t-il si j'ai des "\ n" comme dans la question? Puis-je également résoudre ce problème par CSS?
Froxx
18
Au lieu de white-space: pre-wrap;je préfère utiliser white-space: pre-line;(pour ne pas ajouter de ligne de rupture finale après tout)
jpmottin
5
semble bon, mais qu'en est-il d'un espace géant avant la première ligne? bizarre
Boîte à outils
71

Sans regex:

str = str.split("\n").join("<br />");
paulslater19
la source
2
Si vous faites "\\ n", vous éviterez les problèmes de fractionnement sur le "n" uniquement.
CrowderSoup
10
@CrowderSoup hmm? Je viens de l'essayer et \\nne correspond pas sur une nouvelle ligne, car il recherche backslash+ n.
paulslater19
1
J'ai fait un cas de test. RegEx est légèrement plus rapide, mais jetez un œil
Aley
J'ai trouvé que cette réponse ne fonctionnait que si la barre oblique s'échappait. Par exemple: str = str.split ("\ n"). Join ("<br />");
ACOMIT001
@ ACOMIT001 Je suppose que cela dépend si la chaîne a une nouvelle ligne ou une barre oblique noire et n?
paulslater19
38

Cela fonctionne pour les entrées provenant d'une zone de texte

str.replace(new RegExp('\r?\n','g'), '<br />');
WSkinner
la source
1
C'est la meilleure réponse pour moi parce que vous n'avez pas oublié le \ r, qui est utilisé sur certains systèmes
Bartłomiej Zalewski
1
C'est la meilleure réponse à cette question. Mais je vais juste aller avec <br> pas <br />. Voir celui-ci stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya
8

Si la réponse acceptée ne vous convient pas, vous pouvez essayer.

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

Ça a marché pour moi.

Jethro Larson
la source
2
new RegExp('\n', 'g')est identique à /\n/g(à l'exception de quelques détails sur l'utilisation des littéraux primitifs par rapport à leurs constructeurs).
paupières
2
quelle que soit la raison, cela a fonctionné pour moi mais la réponse acceptée n'a pas fonctionné
nick
1
Ah, c'est pareil ici ... mais mon erreur a été de tenter de spécifier /\n/gune chaîne!
Daniel Fortunov
7

Quel que soit le système:

my_multiline_text.replace(/$/mg,'<br>');
Michele Ongaro
la source
1
Attention: cela ajoutera une balise «<br>» à n'importe quelle chaîne, qu'il y ait ou non «\ n».
mkoeller
4

Il est également important de coder le reste du texte afin de se protéger d'éventuelles attaques par injection 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
la source
4

Cela a fonctionné pour moi lorsque la valeur provenait d'une zone de texte:

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

Pour ceux d'entre vous qui veulent juste permettre max. 2 <br>d'affilée, vous pouvez utiliser ceci:

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

Première ligne: recherchez \nOU \r\noù au moins 2 d'entre eux sont consécutifs, par exemple \n\n\n\n. Puis remplacez-le par 2br

Deuxième ligne: recherchez tous les single \r\nou \nremplacez-les par<br>

Max
la source
1

si vous envoyez la variable depuis PHP, vous pouvez l'obtenir avec ceci avant d'envoyer:

$string=nl2br($string);
Luca C.
la source
0

Il remplacera toute nouvelle ligne avec rupture

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

Si vous souhaitez remplacer toute nouvelle ligne par une seule ligne de rupture

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

En savoir plus sur Regex: https://dl.icewarp.com/online_help/203030104.htm cela vous aidera à chaque fois.

Ritu Gupta
la source
Il est également possible d'utiliser une expression régulière comme celle-ci str = str.replace(/\n+/g, '<br>')pour le deuxième cas
Matteo Basso
0

Ne répondant pas à la question spécifique, mais je suis sûr que cela aidera quelqu'un ...

Si vous avez une sortie de PHP que vous souhaitez rendre sur une page Web en utilisant JavaScript (peut-être le résultat d'une demande Ajax), et que vous souhaitez simplement conserver les espaces blancs et les sauts de ligne, pensez simplement à enfermer le texte dans un <pre></pre>bloc:

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

Essayer

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
la source