如何用<br />元素替换字符串中的所有换行符?


536

如何使用JavaScript从值读取换行符并将所有换行符替换为<br />元素?

例:

从PHP传递的变量如下:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

我希望我的结果在JavaScript转换后看起来像这样:

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

1
您最初的问题出了什么问题?stackoverflow.com/questions/784313/…–
harto

1
您也可以在PHP中执行nl2br($ string),然后再将其发送到JavaScript。
alex

1
我将投票结束前面的问题,因为这有一个更好的例子。
眼睑滑落

2
然后,他应该编辑第一个问题
nickf

我来自对.text()发生了误解的误区。如果您也是这么做的,也请参阅stackoverflow.com/q/35238362/1467396
David

Answers:


1202

这会将所有退货转换为HTML

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

如果您想知道什么?:的意思。它称为非捕获组。这意味着括号内的正则表达式组不会保存在内存中,以后再引用。您可以查看这些线程以获取更多信息:
https : //stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169


77
请注意:(str.replace("\n", '<br />')第一个参数是常规字符串)将仅替换第一个匹配项。
Serge S.

19
另一个版本(以替换多个换行符):str.replace(/(\ n)+ / g,'<br />');
Ritesh

4
@SergeS。感谢您的额外评论。只是为我节省了时间!jsfiddle
EleventyOne 2013年

4
@SergeS。,将String#replace其第一个参数强制String转换为RegExp没有标志的转义实例。str.replace('\n', '<br />');等效于str.replace(new RegExp('\n'), '<br />');
眼睑失明2014年

2
这是一个与str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex进行比较的测试用例 RegEx似乎稍微快一点
Aley

390

如果您只想显示换行符,则可以使用CSS来实现。

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

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

注意:请注意代码的格式和缩进,因为white-space: pre-line它将显示所有换行符(文本后的最后一个换行符除外,请参见小提琴)。


59
很好的答案...需要更多上船服务!
伊恩·奎格利

11
我来到这里寻找正则表达式,然后就离开了。在很多情况下,这就是人们想要的。我们对电子邮件使用换行符,有时需要在html中显示电子邮件的外观。完美的 感谢您寻找在不同的光线问题
Mutmatt

1
这可能适用于实际的换行符,但是如果我在问题中输入“ \ n”怎么办?我也可以通过CSS解决吗?
Froxx

18
而不是 white-space: pre-wrap;我更喜欢使用white-space: pre-line;(毕竟不要添加最后的中断线)
jpmottin

5
看起来不错,但是第一行之前的巨大空间呢?很奇怪
工具包

71

没有正则表达式:

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

2
如果您执行“ \\ n”,则将避免因仅分割“ n”而出现问题。
CrowderSoup

10
@CrowderSoup嗯?我只是试过了,\\n在新行上不匹配,因为它正在寻找backslash+ n
paulslater19 2012年

1
我做了一个测试用例。RegEx的速度稍快一些,但请自己检查jsperf.com/split-join-vs-replace-regex
Aley

我发现除非逃脱斜线,否则此答案无效。例如:str = str.split(“ \ n”)。join(“ <br />”);
ACOMIT001

@ ACOMIT001我想这取决于字符串是换行还是用黑杠加n?
paulslater19


8

如果接受的答案不适合您,则可以尝试。

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

它为我工作。


2
new RegExp('\n', 'g')与相同/\n/g(除了关于使用原始文字与其构造函数的一些细节之外)。
眼睑失明

2
不管是什么原因,这对我都有效,但是被接受的答案却没有
尼克

1
啊,这里一样...但是我的错误是试图指定/\n/g为字符串!
Daniel Fortunov


4

对其余文本进行编码也很重要,以防止可能的脚本注入攻击

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


2

对于那些只想允许最高 <br>连续2 个,您可以使用以下命令:

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

第一行:在其中至少有两个连续的位置搜索\nOR 。然后将其替换为2\r\n\n\n\n\nbr

第二行:搜索所有单个\r\n或,\n然后将其替换为<br>


1

如果您是从PHP发送变量,则可以在发送之前通过以下方式获取它:

$string=nl2br($string);


0

没有回答具体问题,但是我相信这会帮助某人 ...

如果您有PHP的输出要使用JavaScript呈现在网页上(也许是Ajax请求的结果),并且只想保留空格和换行符,请考虑将文本放在一个<pre></pre>块内:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.