正则表达式删除除了<br/>之外的所有html标签

时间:2014-09-16 19:36:18

标签: javascript html regex

我试图在javascript中创建一个regexp来删除输入字符串中的所有html标记,<br>除外。

我使用/(<([^>]+)>)/ig作为标签,并尝试过添加[^(br)]等一些内容,但我现在感到困惑。

有人可以帮忙吗?我确定它会成为SO大师之间的速度竞赛,所以如果答案解释了表达的逻辑,我会选择其他人。

修改:

对所有人来说,不要做这件事&#39;人们,让我引用Stack Overflow

中的以下内容
  

虽然确实要求正则表达式解析任意HTML就像要求Paris Hilton编写操作系统一样,但它有时适合解析一组有限的已知HTML。

在这种特殊情况下,它是div中的一堆文本,在许多页面中保持一致。我只是想摆脱一些用户包含跨度,强势和一些其他格式标签的情况(最多1%)。在我处理的数千个页面中几乎没有发生这种情况的时候,它的价值不仅仅是时间。如果您有更好,更快的实现想法,请随意将其作为答案发布;)

修改2

这么多评论,我想添加免责声明: 使用Regexp解析HTML 错误。它不会始终如一地工作,并且有更好的方法。已经提到了Domparser; Node.js上有Cheerio或jsdom,还有更多的库可以正确解析HTML文档(在99%的情况下)。在这种情况下,它更像是一个字符串恰好包含我需要移除的一些<...>

4 个答案:

答案 0 :(得分:6)

试试这个:

/(<((?!br)[^>]+)>)/ig

答案 1 :(得分:3)

使用DOMParser解析字符串,然后遍历它(我使用this question中的代码),提取您感兴趣的部分:

&#13;
&#13;
var str = "<div>some text <span>some more</span><br /><a href='#'>a link</a>";
var parser = new DOMParser();
var dom = parser.parseFromString(str, "text/html");
var text = "";
var walkDOM = function (node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walkDOM(node,func);
        node = node.nextSibling;
    }
};

walkDOM(dom, function (node) {
    if (node.tagName === 'BR') {
        text += node.outerHTML;
    }
    else if (node.nodeType === 3) { // Text node
        text += node.nodeValue;
    }        
});

alert(text);
&#13;
&#13;
&#13;    

答案 2 :(得分:0)

这可能有用。但是,无论正则表达式如何,它都无法解析html。

 # /(?!<\/?br\s*\/?>)<[^>]+>/g

 (?! < /? br \s* /? > )
 < [^>]+ >

答案 3 :(得分:0)

我最终使用了:

.replace('<br>','%br%').replace(/(<([^>]+)>)/g,'')
然后我分裂了&#39;%br%&#39;而不是常规的br标签。 它是不是HTML解析器,我相信它将无法解析100%的万维网,并且它在100%的时间内解决了我的特定问题(只是经过了尝试和测试)。