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

use*_*983 51 html javascript jquery replace line-breaks

我如何使用JavaScript进行检测

<br>
<br>
<br>
Run Code Online (Sandbox Code Playgroud)

成为一体

<br>
Run Code Online (Sandbox Code Playgroud)

我尝试过:

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

但这不适合我.

小智 171

CSS解决方案

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

br + br { display: none; }
Run Code Online (Sandbox Code Playgroud)

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

<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
Run Code Online (Sandbox Code Playgroud)

在其他情况下,像这样:

Hello World<br />   <br />
Hello World<br />   <br />
Hello World<br />   <br />
Run Code Online (Sandbox Code Playgroud)

它将失败(因为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';
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

  • @Joseph"br + br"的定义是直接放在另一个br元素之后的br元素.它只匹配一个元素,而不是两个元素.选择器将匹配除第一个之外的所有连续br元素. (23认同)
  • 如果之间没有标签,这个解决方案可以删除一些比预期更多的```:http://jsfiddle.net/ahMMv/13/ (13认同)
  • (对不起最后一次不正确的评论)这是对@zch发现的问题的补救措施:http://jsfiddle.net/ahMMv/17/ (3认同)
  • 这些新奇的jigga mahoo是什么?自从我初学者以来,情况发生了变化. (2认同)
  • @ 0x499602D2你的意思是CSS中的+令牌吗?这是标准的一段时间,因为有> (2认同)
  • @jackweirdy:事实上,如果他像他一样年轻,他们已经达到了标准[从他3岁开始](http://www.w3.org/TR/1998/REC-CSS2-19980512/selector.html)他的个人资料说.(我现在觉得老了.) (2认同)

Kaz*_*Kaz 10

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

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

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

  • @ w4rumu或者HTML可能来自不同的网站.Javascript并不总是包含特定网站的包.可以在浏览器中运行Javascript作为浏览器扩展,为用户编辑HTML. (6认同)
  • 也许多个`<br>`标签已经由Javascript创建. (2认同)
  • 虽然总的来说您的建议很好(所以 +1),但它并没有直接回答问题。有时您必须处理 html,而您完全无法控制谁生成它或为什么以这种方式生成它——在这种情况下,对此类问题的直接解决方案变得有益,而诸如“从头修复它”之类的事情变得不可能。(另一方面,通常这些类型的 html 转换无论如何您都无法控制发生在服务器端,在这种情况下,它们可以在服务器端修复 - javascript 可能是在错误的地方执行此操作任何情况)。 (2认同)

mar*_*ful 7

更简单:

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

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