从字符串中删除 HTML 标记的正则表达式 [重复]

Posted

技术标签:

【中文标题】从字符串中删除 HTML 标记的正则表达式 [重复]【英文标题】:Regular expression to remove HTML tags from a string [duplicate] 【发布时间】:2012-06-27 15:30:27 【问题描述】:

可能重复:Regular expression to remove html tags

是否有一个表达式可以获取两个 HTML 标签之间的值?

鉴于此:

<td class="played">0</td>

我正在寻找一个表达式,它将返回 0,剥离 &lt;td&gt; 标记。

【问题讨论】:

那是字符串,整个字符串,除了字符串什么都没有?如果是这样,\d+ 怎么样? 我正在使用这样的东西:(?:&lt;style.+?&gt;.+?&lt;/style&gt;|&lt;script.+?&gt;.+?&lt;/script&gt;|&lt;(?:!|/?[a-zA-Z]+).*?/?&gt;) 并替换为"" 如果您正在阅读此问题,阅读已接受的重复答案。这里的前两个答案都容易受到非常简单的输入的影响。 TL;DR:正则表达式对于正确剥离 HTML 标记很有用。 【参考方案1】:

您不应尝试使用正则表达式解析 HTML。 HTML 不是常规语言,因此您提出的任何正则表达式都可能在某些深奥的边缘情况下失败。有关详细信息,请参阅this question 的开创性答案。虽然大多被格式化为一个笑话,但这是一个非常好的观点。


以下示例是 Java,但对于其他语言,正则表达式将是相似的——如果不相同的话。


String target = someString.replaceAll("<[^>]*>", "");

假设您的非 html 不包含任何 并且您的输入字符串结构正确。

如果你知道它们是一个特定的标签——例如你知道文本只包含&lt;td&gt;标签,你可以这样做:

String target = someString.replaceAll("(?i)<td[^>]*>", "");

编辑: Ωmega 在另一篇帖子的评论中提出了一个很好的观点,即如果有多个标签,这将导致多个结果全部被挤压在一起。

例如,如果输入字符串是&lt;td&gt;Something&lt;/td&gt;&lt;td&gt;Another Thing&lt;/td&gt;,那么上面的结果将是SomethingAnother Thing

在需要多个标签的情况下,我们可以这样做:

String target = someString.replaceAll("(?i)<td[^>]*>", " ").replaceAll("\\s+", " ").trim();

这会将 HTML 替换为一个空格,然后折叠空格,然后修剪两端的任何空格。

【讨论】:

这里的重点是返回匹配项。如果字符串中有更多的数学,您会将它们合并为一个混乱的字符串。示例:&lt;div&gt;text&lt;/div&gt;&lt;p&gt;here&lt;/p&gt;。明白了吗? 你不应该对我投反对票。我没有对你投反对票。如果你愿意,我现在可以通过对你投反对票来证明这一点...... OP 说,“我正在寻找一个返回 0 的表达式,去掉 标签。”帖子的标题是“从字符串中删除 html 标签的正则表达式”。我剥离了&lt;td&gt; 标签。 OP 中没有任何地方提到过关于模式 matching 的任何内容。 @Netsi1964 这与答案中已经提出的解决方案有何不同? @Netsi1964 - 实际上我的示例是 Java 并且在字符串上执行。我在答案中添加了一条说明这一点的注释。 【参考方案2】:

一个简单的方法是替换

<[^>]*>

什么都没有。但根据您的输入结构的不良程度,这很可能会失败。

【讨论】:

替换不是好办法。对于更多匹配项,您可以将它们合并为一个字符串。 我不明白你想说什么。 给定&lt;td&gt;First&lt;/td&gt;&lt;td&gt;Second&lt;/td&gt;,在您帖子中的模式上使用replaceAll 将导致FirstSecond 啊,是的。确实。但是给定&lt;b&gt;a&lt;/b&gt;&lt;i&gt;b&lt;/i&gt; 的结果ab 是意料之中的。所以这不是你可以轻易决定的事情。此外,在浏览器中查看 XML 会导致相同的情况,将所有文本节点折叠在一起。 这是一个即使对于格式错误的 html 也能正常工作的正则表达式 - ***.com/a/51177854/4717533【参考方案3】:

你可以用 jsoup http://jsoup.org/ 做到这一点

Whitelist whitelist = Whitelist.none();
String cleanStr = Jsoup.clean(yourText, whitelist);

【讨论】:

JSoup 是一个非常酷的库,但除非 OP 计划做的不仅仅是他在原始帖子中描述的简单替换,否则它可能是一个相当重的解决方案。

以上是关于从字符串中删除 HTML 标记的正则表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 将 HTML 转换为有效的 XML 标记 [重复]

想要删除任何 HTML 标签 [重复]

从字符串中删除 HTML 标记

正则表达式删除所有空的 HTML 标记

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

使用python,从字符串中删除HTML标签/格式[重复]