0

我有一个与此相似的字符串

<td><p>alakjsdlajsdlkj</p><p><b>asdkjalsdkjaskldj</b></p><p>asdjlaksjdlaksjd</p></td>

抓取标签之间所有内容的正则表达式是什么?

我想获取以下内容(包括 HTML)

<p>alakjsdlajsdlkj</p><p><b>asdkjalsdkjaskldj</b></p><p>asdjlaksjdlaksjd</p>
4

4 回答 4

2

您无法使用正则表达式完成此操作。它们只是描述性/功能不够强大,主要是因为没有机制来跟踪它已经看到了多少东西。简而言之,这是因为正则表达式机制没有堆栈的概念(它代表有限状态机,而不是下推自动机)。

例如,考虑模式<p>(.*)</p>。如果您使用贪婪模式(尽可能匹配)并且有一个类似 的字符串<p>first</p><p>second</p>,则匹配将是first</p><p>second. 如果您使用非贪婪模式(尽可能进行最小匹配)并获得类似 的字符串<p><p>stuff</p></p>,您将获得 match 的奖励<p>stuff。因此,两种模式都不能很好地涵盖所有情况(或任何情况)。

As @kristopher points out, it's possible to have a pattern that avoids including another tag inside the match, but this will only match innermost tags.

To do what you want robustly, you'll need an actual parser. Several html parsing solutions have been created by others, or for simple parsing needs, you might be able to write your own.

于 2012-10-04T02:09:22.303 回答
1

如果您的标签嵌套,这会很快变得混乱。

您无法使用 html 解析器库吗?这样做会更好。

<([^>]+)>([^<]+)</\1>

获取任何用尖括号括起来的字符串以及直到下一个标签的任何字符

这虽然不处理嵌套或不匹配的标签

<div>test <b>nested</b></div>

只会捕获 < b > 而不是 div,因为 < div > 会在遇到自己标签的结尾之前遇到 < b > 的开头。

于 2012-10-04T01:58:17.760 回答
1

如果您不能使用HTML 解析器并且 td 和结尾 td 位于字符串的开头和结尾:

^<td>(.*)</td>$
于 2012-10-04T02:01:59.110 回答
1

试试这个,它应该只匹配最外面的标签并返回组中的内部字符串

^<\w+>(.*)</\w+>$

但它不会检查正确的嵌套等。如果可能,请使用适当的框架。

于 2012-10-04T02:03:15.827 回答