【问题标题】:Regexp to remove all html tags except <br>正则表达式删除除 <br> 之外的所有 html 标记
【发布时间】:2014-09-16 19:36:17
【问题描述】:

我正在尝试在 javascript 中创建一个正则表达式,以从输入字符串中删除所有 html 标签,&lt;br&gt; 除外。

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

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

编辑:

对于所有“不要这样做”的人,让我引用Stack Overflow的以下内容

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

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

编辑 2

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

【问题讨论】:

  • 提示:使用正则表达式解析 HTML 内容绝不是一个好主意。
  • 强制不要这样做链接:stackoverflow.com/q/1732348/1615483
  • 我会说,即使尝试使用有效的 html 解析器也会更好。然而这个&lt;([^&gt;]+)&gt; 并不是这样的尝试。至少您必须解析 cmets 以及通用标签结构。如果你需要,我可以放下一个巨大的正则表达式。
  • text = text.replace(/&lt;(?!br\s*/?&gt;)[^&lt;&gt;]*&gt;/ig, ''); 会做得很好。

标签: javascript html regex


【解决方案1】:

试试这个:

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

【讨论】:

  • 只是一个兴趣点。此正则表达式将匹配任何以/br/i 开头的标签名称
【解决方案2】:

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

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

【讨论】:

  • 是的,这就是我想要避免的。我的问题真的不值得包含;)谢谢,这是一个很酷的 sn-p,将来会派上用场。
  • 没问题,如果您觉得有用,请随时点赞。就我个人而言,我会建议在总体方案中使用这种方法,它实际上并没有那么多行,而且比任何正则表达式都灵活得多。值得改掉使用正则表达式解决这类问题的习惯,获得更多以结构化方式遍历 HTML 的经验。
  • 我以编写爬虫为生,所以我一直使用常规解析器,我完全同意你的原则。在这种情况下,只是不值得,我曾经使用过的一个小脚本完成了这项工作。结束了。大局没有被打乱,自然秩序恢复了。伙计们,说真的,不要使用正则表达式来解析 HTML,这很糟糕。
  • 很公平,我想这类问题的问题在于,除了您之外,没有人知道您尝试使用的字符串范围的确切格式,所以不可能知道在哪里基于正则表达式的解决方案将失败。另一方面,基于解析器的方法很可能会成功。
【解决方案3】:

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

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

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

【讨论】:

  • 在这种情况下,一个普通的 html 解析器将是矫枉过正,这真的是几个标签的问题
【解决方案4】:

我最终使用了:

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

然后我拆分 '%br%' 而不是常规的 br 标记。 它不是 HTML 解析器,我确信它无法解析 100% 的万维网,并且它可以 100% 地解决我的特定问题(刚刚尝试和测试过)。 p>

【讨论】:

  • 您不需要i 修饰符。
  • 它会删除这个&lt;tag att1 = "&gt;hello world" att2 = 'ab"c'/&gt; 吗?
  • @sln 不,它不会,但我的数据集只包含 、一些 以及更多。
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多