只用一个替换多个<br/>

时间:2013-06-12 09:22:59

标签: javascript jquery html replace line-breaks

如何使用JavaScript检测

<br>
<br>
<br>

成为一个

<br>

我尝试过:

jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n");

但这不适合我。

9 个答案:

答案 0 :(得分:170)

CSS解决方案

如果要在页面上禁用多个<br>的效果,可以在不使用JavaScript的情况下通过CSS执行此操作:

br + br { display: none; }

但是,当您使用标记时,此方法非常理想,如下所示:

<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />

在其他情况下,像这样:

Hello World<br />   <br />
Hello World<br />   <br />
Hello World<br />   <br />

它将失败(因为CSS传递文本节点)。相反,请使用JavaScript解决方案。


JavaScript解决方案

// It's better to wait for document ready instead of window.onload().
window.onload = function () {
    // Get all `br` tags, defined needed variables
    var br = document.getElementsByTagName('br'),
        l = br.length,
        i = 0,
        nextelem, elemname, include;

    // Loop through tags
    for (i; i < l - 1; i++) {
        // This flag indentify we should hide the next element or not
        include = false;

        // Getting next element
        nextelem = br[i].nextSibling;

        // Getting element name
        elemname = nextelem.nodeName.toLowerCase();

        // If element name is `br`, set the flag as true.
        if (elemname == 'br') {
            include = true;
        }

        // If element name is `#text`, we face text node
        else if (elemname == '#text') {
            // If text node is only white space, we must pass it.
            // This is because of something like this: `<br />   <br />`
            if (! nextelem.data.replace(/\s+/g, '').length) {
                nextelem = br[i+1];
                include = true;
            }
        }

        // If the element is flagged as true, hide it
        if (include) {
            nextelem.style.display = 'none';
        }
    }
};

答案 1 :(得分:10)

将HTML(以您不想要的形式)发送到客户端浏览器并使其运行JavaScript代码以清理它有什么意义?这看起来很糟糕。

如何修复所有静态HTML和HTML生成,以便首先不会出现这些多余的<br>元素?

如果您使用JavaScript修改文档对象,请执行以下任何其他方式无法实现的动态效果。

答案 2 :(得分:7)

简单:

var newText = oldText.replace(/(<br\s*\/?>){3,}/gi, '<br>');

这将允许可选的标记终止符(/&gt;)以及标记结束前的空格(例如<br /><br >)。

答案 3 :(得分:1)

这样的事情不是正确的方法:

$("br~br").remove()
编辑:不,这是错的,因为它的定义是连续的&#34;根据BoltClock,太松了。

答案 4 :(得分:0)

试试这个:

jQuery('body').html(
      jQuery('body').html().replace(/(?:<br>\s+){3,}/ig,"\n"));
);

<强>样本:     jsfiddle

答案 5 :(得分:0)

试试这个

$('body').html($('body').html().replace(/(<br>)+/g,"<br>"));

它会将n个<br>替换为一个。

Demo

答案 6 :(得分:0)

我会这样做:

$('body').html($('body').html().replace(/<br\W?\\?>(\W?(<br\W?\\?>)+)+/g,"<br>"));

然而,在阅读了另一篇文章中的评论后,我确实认为你应该尽量避免这样做,以防你在后端纠正它。

答案 7 :(得分:0)

此解决方案仅限jQuery + DOM,不作为字符串操作HTML,与文本节点一起使用,仅忽略空白文本节点:

$('br').each(function () {
  const {nodeName} = this;

  let node = this;

  while (node = node.previousSibling) {
    if (node.nodeType !== Node.TEXT_NODE || node.nodeValue.trim() !== '') {
      break;
    };
  }

  if (node && node !== this && node.nodeName === nodeName) {
    $(node).remove();
  }
});

请参阅:https://jsfiddle.net/kov35jct/

答案 8 :(得分:0)

此问题的许多其他答案只会最多替换一定数量的元素,或使用复杂的循环。我想出了一个简单的正则表达式,可以用一个标签替换 any 1..2 .. . 0... .1 标签。这适用于字符串中多个标签的多个实例。

<br>

要在JavaScript中实现此功能,可以使用/(<br>*)+/g 方法:

String.replace

要替换多个myString.replace(/(<br>*)+/g, "<br/>"); 标签,请在正则表达式中添加<br/>

/