从字符串中删除 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
,剥离 <td>
标记。
【问题讨论】:
那是字符串,整个字符串,除了字符串什么都没有?如果是这样,\d+
怎么样?
我正在使用这样的东西:(?:<style.+?>.+?</style>|<script.+?>.+?</script>|<(?:!|/?[a-zA-Z]+).*?/?>)
并替换为""
。
如果您正在阅读此问题,请阅读已接受的重复答案。这里的前两个答案都容易受到非常简单的输入的影响。 TL;DR:正则表达式不对于正确剥离 HTML 标记很有用。
【参考方案1】:
您不应尝试使用正则表达式解析 HTML。 HTML 不是常规语言,因此您提出的任何正则表达式都可能在某些深奥的边缘情况下失败。有关详细信息,请参阅this question 的开创性答案。虽然大多被格式化为一个笑话,但这是一个非常好的观点。
以下示例是 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 替换为一个空格,然后折叠空格,然后修剪两端的任何空格。
【讨论】:
这里的重点是返回匹配项。如果字符串中有更多的数学,您会将它们合并为一个混乱的字符串。示例:<div>text</div><p>here</p>
。明白了吗?
你不应该对我投反对票。我没有对你投反对票。如果你愿意,我现在可以通过对你投反对票来证明这一点......
OP 说,“我正在寻找一个返回 0 的表达式,去掉 <td>
标签。 OP 中没有任何地方提到过关于模式 matching 的任何内容。
@Netsi1964 这与答案中已经提出的解决方案有何不同?
@Netsi1964 - 实际上我的示例是 Java 并且在字符串上执行。我在答案中添加了一条说明这一点的注释。
一个简单的方法是替换
<[^>]*>
什么都没有。但根据您的输入结构的不良程度,这很可能会失败。
【讨论】:
替换不是好办法。对于更多匹配项,您可以将它们合并为一个字符串。 我不明白你想说什么。 给定<td>First</td><td>Second</td>
,在您帖子中的模式上使用replaceAll
将导致FirstSecond
。
啊,是的。确实。但是给定<b>a</b><i>b</i>
的结果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 标记 [重复]