Regexp to remove all html tags except <br>

Regexp to remove all html tags except <br>

本文关键字:lt br gt except tags to remove all html Regexp      更新时间:2023-09-26

我正在尝试用javascript制作一个regexp,以从输入字符串中删除除<br>之外的所有html标记。

我使用/(<([^>]+)>)/ig作为标签,并尝试了一些方法,如添加[^(br)],但我现在只是感到困惑。

有人能帮忙吗?我相信这将是SO大师之间的速度竞赛,所以如果答案解释了这个表达的逻辑,我会选择它而不是其他表达。

编辑:

对于所有"不要这么做"的人,让我引用Stack Overflow 中的以下内容

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

在这种特殊情况下,它是div中的一堆文本,在许多页面中保持一致。我只想去掉少数情况(最多1%),其中用户包括跨度、strong和其他一些格式标记。它不值得花更多的时间来正则表达式,因为它几乎不会在我处理的数千页中发生。如果你有一个更好、更快实现的想法,请随时将其作为答案发布;)

编辑2

这么多评论,我想添加一个免责声明:使用Regexp解析HTML是非常糟糕的。它不会一直有效,而且还有更好的方法。Domparser已经被提及;Node.js上有Cheerio或jsdom,还有更多的库可以正确解析HTML文档(在99%的情况下)。在这种情况下,它更像是一个字符串,恰好包含一些我需要删除的<...>

试试这个:

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

使用DOMParser解析字符串,然后遍历它(我在这个问题中使用了代码),提取您感兴趣的部分:

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);

这可能会奏效。但是,不管正则表达式是什么,它都无法解析html。

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

我最终使用了:

.replace('<br>','%br%').replace(/(<([^>]+)>)/g,'')

然后我拆分了"%br%",而不是常规的br标记。它不是一个HTML解析器,我相信它将无法100%解析万维网,并且它100%地解决了我的特定问题(只是经过了尝试和测试)。