简体   繁体   English

jQuery / JS,删除/修剪尾随html换行符?

[英]jQuery/JS, removing/trimming trailing html line breaks?

I'm looking for some ideas for the most efficient way to remove trailing html < br /> tags using javascript or jquery. 我正在寻找一些想法,以最有效的方式使用javascript或jquery删除尾随的html <br />标签。

RULES: 规则:

  1. The br, at the front and end must be removed. 必须移除前端和后端的br。
  2. It must remove non-closing and self-closing br tags. 它必须删除非关闭和自动关闭的br标签。
  3. All br within the textual content must remain untouched. 文本内容中的所有内容都必须保持不变。

THE HTML: HTML:

<div class="generatedContent">
    <br>My awesome content.
    <br><br>Some More awesome content.
    <br>
    <br>
    <br>I still need the content written here<br/>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
</div>



THE DESIRED OUTPUT: 期望的输出:

<div class="generatedContent">
    My awesome content.
    <br><br>Some More awesome content.
    <br>
    <br>
    <br>I still need the content written here
</div>

Can't understand why you'd want to to use regular expressions for this, as most answers are. 无法理解你为什么要使用正则表达式,因为大多数答案都是。 Using DOM methods is easy here: 使用DOM方法很简单:

function isBrOrWhitespace(node) {
    return node && ( (node.nodeType == 1 && node.nodeName.toLowerCase() == "br") ||
           (node.nodeType == 3 && /^\s*$/.test(node.nodeValue) ) );
}

function trimBrs(node) {
    while ( isBrOrWhitespace(node.firstChild) ) {
        node.removeChild(node.firstChild);
    }
    while ( isBrOrWhitespace(node.lastChild) ) {
        node.removeChild(node.lastChild);
    }
}

$(".generatedContent").each( function() {
    trimBrs(this);
} );

Try this: 试试这个:

var everything = $('.generatedContent').contents();
for(var i=everything.length-1;i>0;i--)
{
    if((everything.get(i).tagName == 'BR'
           && everything.get(i-1).tagName == 'BR')
        || (everything.get(i).textContent.match(/\w/)==null))
        $(everything.get(i)).remove();
    else
        break;
}

It seems to work in FF and IE7, that I've tried. 它似乎在FF和IE7中工作,我尝试过。

Could probably be improved but it should work: 可能会改进,但它应该工作:

$('.generatedContent').each(function() {
    var str = $(this).html();
    var regex1 = /^([\n ]*)(<br.*?>)*/;
    var regex2 = /(<br.*?>)*([\n ]*)$/;
    str = str.replace(regex1,'');
    str = str.replace(regex2,'');
    $(this).html(str);
})

Pretty simple. 很简单。 Take the HTML of the generatedContent div then apply the following regex: 获取generatedContent div的HTML,然后应用以下正则表达式:

s = s.replace(/^(\s*<br\s*\/?>)*\s*|\s*(<br\s*\/?>\s*)*$/g, '')

There's probably a more efficient way to do it using pure JS, but this is probably more succint. 使用纯JS可能有一种更有效的方法,但这可能更多的是succint。

Here is a non regex solution that works for me in Firefox. 这是一个非正则表达式解决方案,适用于Firefox。 Could probably use some better edge case handling but the idea works. 可能会使用一些更好的边缘案例处理,但这个想法有效。 Basically it just finds the first and last non-empty text nodes and removes all nodes before and after. 基本上它只是找到第一个和最后一个非空文本节点,并删除之前和之后的所有节点。

var firstValidTextNode = -1;
var lastValidTextNode = -1;
$('.generatedContent').contents().each(function(index){
    if (this.nodeType != 1 && $.trim($(this).text()).length) {
        if (firstValidTextNode == -1) firstValidTextNode = index;
        lastValidTextNode = index;
    }
});

if (lastValidTextNode != -1 && firstValidTextNode != -1)
    $('.generatedContent').contents().slice(0, firstValidTextNode).remove().end().slice(lastValidTextNode + 1).remove();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM