jQuery将换行符转换为br(等效于nl2br)


109

我让jQuery提取一些textarea内容并将其插入li中。

我希望它在视觉上保留换行符。

必须有一种非常简单的方法来执行此操作...


XSS注意:如果这样做,听起来好像您是在直接混合用户输入和<br/>,这意味着您正在显示换行符或<br/s>,因此可能会受到XSS攻击,即您的输入来自网站上的任何其他用户。
user420667

Answers:


163

演示: http //so.devilmaycode.it/jquery-convert-line-breaks-to-br-nl2br-等效

function nl2br (str, is_xhtml) {   
    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';    
    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}

5
谢谢你,这很完美。奇怪的是这不是jQuery的官方功能。
gbhall 2010年

4
因为jQuery并不是要替换本机javascript函数(例如replace),而是专注于CSS选择器链接和易于访问!也许是将来的版本;-)
卡·菲洛索菲

太棒了 帮助我解决了IE7不支持空格的问题:换行前
Kevin Pauli 2010年

该正则表达式不是意味着如果一行以“>”结尾,那么它不会添加BR?我知道我在HTML中使用&gt; 但是用户生成的内容不能很好地起作用……
Dave Stein

@DaveStein不,我已经尝试过使用'>'和'&gt;' 并且两次都添加了换行符。我认为该功能代码基本上是完美的:)
杰克(Jake)2012年

90

您可以简单地执行以下操作:

textAreaContent=textAreaContent.replace(/\n/g,"<br>");

干杯,这种工作方式,除了它将多个换行符视为一个换行符。
gbhall 2010年

4
我已经对其进行了更新,现在它使用了一个正则表达式,因此,如果您要将多个换行符视为单个br,请使用以下命令更改正则表达式:/ \ n + / g
mck89 2010年

谢谢。希望有人会发现您的答案有用,但是下面的功能也能正常工作。我为您付出更多的努力感到难过,但是更需要一个功能。
gbhall 2010年

如果你得到错误“x.replace不是一个函数”,然后使用x.toString()代替。
VÖRÖSAmadea

29

将其放在您的代码中(最好放在通用的js函数库中):

String.prototype.nl2br = function()
{
    return this.replace(/\n/g, "<br />");
}

用法:

var myString = "test\ntest2";

myString.nl2br();

创建字符串原型函数使您可以在任何字符串上使用它。


29

本着更改呈现而不是更改内容的精神,以下CSS 使每个换行符的行为类似于<br>

white-space: pre;
white-space: pre-line;

为什么要使用两个规则:pre-line仅影响换行符(感谢线索,@ KevinPauli)。IE6-7和其他旧的浏览器回落到更极端的状态pre,其中还包括nowrap并呈现多个空格。有关这些设置和其他设置(pre-wrap)的详细信息,请参见mozillacss-tricks(感谢@Sablefoste)。

虽然我通常不赞成SO偏向于猜测问题而不是回答问题,但在这种情况下,用<br>标记替换换行符可能会增加用户未经洗刷的输入攻击的脆弱性。每当您发现自己要更改字面意义所暗示的.text()呼叫时,就会越过一条红线.html()。(感谢@AlexS强调了这一点。)即使您当时排除了安全风险,将来的更改也可能会无意间引入它。相反,此CSS允许您使用safer获得硬换行而无需标记.text()


1
根据具体情况,这是最简单的解决方案,并且确实可以很好地回答问题。您可能还会考虑其他任何white-space:选项,例如pre-wrap。参见css-tricks.com/almanac/properties/w/whitespace
Sablefoste

这确实是最好的答案-字符串替换解决方案意味着需要使用它.html()来设置内容,这反过来又将允许用户插入任意HTML,除非您事先将其过滤掉。
Alex S

关于.html()危险@AlexS的要点,已尝试合并。
鲍勃·斯坦

2

使用此代码

jQuery.nl2br = function(varTest){
  return varTest.replace(/(\r\n|\n\r|\r|\n)/g, "<br>");
};

1

此JavaScript函数考虑使用插入还是替换来处理交换。

(插入或替换HTML换行符)

/**
 * This function is same as PHP's nl2br() with default parameters.
 *
 * @param {string} str Input text
 * @param {boolean} replaceMode Use replace instead of insert
 * @param {boolean} isXhtml Use XHTML 
 * @return {string} Filtered text
 */
function nl2br (str, replaceMode, isXhtml) {

  var breakTag = (isXhtml) ? '<br />' : '<br>';
  var replaceStr = (replaceMode) ? '$1'+ breakTag : '$1'+ breakTag +'$2';
  return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, replaceStr);
}

演示-JSFiddle

JavaScript nl2br和br2nl函数


1

我为此编写了一个jQuery扩展:

$.fn.nl2brText = function (sText) {
    var bReturnValue = 'undefined' == typeof sText;
    if(bReturnValue) {
        sText = $('<pre>').html(this.html().replace(/<br[^>]*>/i, '\n')).text();
    }
    var aElms = [];
    sText.split(/\r\n|\r|\n/).forEach(function(sSubstring) {
        if(aElms.length) {
            aElms.push(document.createElement('br'));
        }
        aElms.push(document.createTextNode(sSubstring));
    });
    var $aElms = $(aElms);
    if(bReturnValue) {
        return $aElms;
    }
    return this.empty().append($aElms);
};

0

改善@Luca Filosofi的公认答案,

如果需要,将此正则表达式的/([^>[\s]?\r\n]?)begining 子句更改为还将吸收换行符在标签和一些空格之后而不是仅在标签后紧跟换行符的情况


0

在DOM中从文本区域插入文本以保持换行符的另一种方法是使用Node.innerText属性,该属性表示节点及其后代的渲染文本内容。

作为一种获取方法,它近似于用户使用光标突出显示元素的内容然后将其复制到剪贴板时将获得的文本。

该属性于2016年成为标准配置,并得到了现代浏览器的大力支持。发布此答案时,我可以使用:97%的全球覆盖率。

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.