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

133

可能是重复问题:
正则表达式去除HTML标签

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

例如这样:

<td class="played">0</td>
我正在寻找一个表达式,它可以返回0,同时去除<td>标签。

4
那个字符串是不是指完整的字符串且没有其他内容?如果是,那\d+怎么样? - Ry-
4
我正在使用类似于以下的内容:(?:<style.+?>.+?</style>|<script.+?>.+?</script>|<(?:!|/?[a-zA-Z]+).*?/?>),并将其替换为 "" - Josh M.
如果您正在阅读本问题,请务必阅读重复问题的被接受答案。这里的前两个答案都容易受到非常简单的输入攻击。简而言之,正则表达式并不能很好地去除HTML标签。 - Claudia
1
<[^>]*>[^>]*<[^>]*> if you need to remove the context and HTML tag. example: hello<sub>2</sub> guys will be hello guys - MBK
这个正则表达式 <\/?\w[^>]*>|&\w+; 需要一个正确的标签。例如:"3 <5 and 10 > 9" 不会被删除,同时也会删除像   这样的 HTML 代码。 - Evandro Jr
3个回答

218

不应尝试使用正则表达式解析HTML。HTML不是正则语言,因此您想出的任何正则表达式都可能在某些奇特的边缘情况下失败。请参考此问题的经典答案,其中大多数内容为玩笑形式,但其表达的观点非常好。


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


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

假设您的非HTML内容不包含任何 < 或 > ,并且您的输入字符串结构正确。

如果您知道它们是特定标签 - 例如,您知道文本仅包含 <td> 标记,您可以执行以下操作:

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

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

例如,如果输入字符串为<td>Something</td><td>Another Thing</td>,则上述方法将导致SomethingAnother Thing的结果。

在预期存在多个标签的情况下,我们可以这样做:

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

这将用一个空格替换HTML,然后折叠空白,最后修剪掉两端的任何空格。


6
重点是返回匹配的结果,如果在字符串中有多个匹配结果,您将把它们合并为一个混乱的字符串。例如:<div>text</div><p>here</p>。明白了吗? - Ωmega
3
楼主说:“我正在寻找一个表达式,它将返回0,去除<td>标签。”帖子的标题是“用正则表达式从字符串中删除html标记”。我去掉了<td>标签。楼主没有提到任何有关模式匹配的内容。 - Roddy of the Frozen Peas
你应该或者可以使用以下这个正则表达式版本: string target = stringContainingHTMLTags.replace(/<[^>]*>/ig, ""); - Netsi1964
1
@Netsi1964,这与答案中已经提出的解决方案有何不同? - Roddy of the Frozen Peas
3
@Netsi1964- 实际上,我的例子是针对Java的,并且在字符串上执行。我已经在答案中添加了一个注释来说明这一点。 - Roddy of the Frozen Peas
显示剩余6条评论

91

一种简单的方法是进行替换

<[^>]*>

什么都没有。但是根据你的输入结构有多么不规范,可能会失败。


1
替换并不是一个好的方法。如果要匹配更多内容,您应该将它们合并为一个字符串。 - Ωmega
6
好的,我会尽力进行翻译。根据 <b>a</b><i>b</i> 的组合,预期结果应该是 ab,因此这并不是一个容易决定的事情。此外,在浏览器中查看 XML 文件也会出现相同的问题,导致所有文本节点都被折叠在一起。 - Joey
尝试使用以下代码对<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAA‌​QABAAACAkQBADs=" onload="$.getScript('evil.js');1<2>3">进行检测。它无法正确地移除它。(这会加载一个1像素的GIF,然后假设jQuery已经存在,就会加载一个脚本。) - Claudia
@IsiahMeadows: “但是,根据您的输入结构如何不规范,这可能会失败。” - Joey
1
这是一个正则表达式,即使在格式不正确的HTML中也能很好地工作-https://dev59.com/uW865IYBdhLWcg3wfemU#51177854 - Niket Pathak
显示剩余2条评论

8

你可以使用jsoup http://jsoup.org/完成它。

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

14
JSoup是一个非常酷的库,但除非原帖中的作者计划做更多的事情,而不仅仅是描述中提到的简单替换,否则它可能是一个过于笨重的解决方案。 - Roddy of the Frozen Peas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接