110

可能重复:
删除 HTML 标记的正则表达式

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

鉴于这种:

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

我正在寻找一个将返回的表达式0,剥离<td>标签。

4

3 回答 3

190

您不应尝试使用正则表达式解析 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 替换为一个空格,然后折叠空格,然后修剪末尾的任何空格。

于 2012-06-27T15:42:25.103 回答
77

一个简单的方法是替换

<[^>]*>

一无所有。但是,根据您的输入结构的不良程度,这很可能会失败。

于 2012-06-27T15:31:39.117 回答
6

你可以用 jsoup http://jsoup.org/

Whitelist whitelist = Whitelist.none();
String cleanStr = Jsoup.clean(yourText, whitelist);
于 2012-06-27T15:34:05.413 回答