我有一个与此类似的字符串
<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>
答案 0 :(得分:2)
使用正则表达式无法实现此目的。它们只是没有足够的描述性/强大性,主要是因为没有机制来跟踪它所看到的事物的数量。简而言之,这是因为正则表达式机制没有堆栈的概念(它代表有限状态机,而不是下推自动机)。
例如,考虑模式<p>(.*)</p>
。如果您使用了贪婪模式(尽可能匹配)并且拥有类似<p>first</p><p>second</p>
的字符串,则匹配将为first</p><p>second
。如果您使用非贪婪模式(尽可能进行最小匹配)并获得类似<p><p>stuff</p></p>
的字符串,您将获得匹配<p>stuff
的奖励。因此,两种模式都不能很好地涵盖所有情况(或任何情况)。
正如@kristopher指出的那样,可以使用一种避免在匹配中包含另一个标记的模式,但这只会匹配最里面的标记。
要做到你想要的健壮,你需要一个真正的解析器。其他人已经创建了几个html解析解决方案,或者为了简单的解析需求,你可以编写自己的解析解决方案。
答案 1 :(得分:1)
如果您的标签嵌套,这会变得很乱。
你不能使用html解析器库吗?这样做会更好。
<([^>]+)>([^<]+)</\1>
得到你 包含在尖括号中的任何字符串 加上任何字符,直到下一个标记
这不会处理嵌套或不匹配的标签
<div>test <b>nested</b></div>
只会抓住 &LT; b> 自&lt;以来不是div div>会遇到&lt;的开始b>在遇到自己的标签结束之前。
答案 2 :(得分:1)
如果你不能使用HTML parser并且td和结尾的td位于字符串的开头和结尾:
^<td>(.*)</td>$
答案 3 :(得分:1)
试试这个,它应该匹配最外面的标签并返回组中的内部字符串
^<\w+>(.*)</\w+>$
但它不检查正确的嵌套等。如果可能,请使用适当的框架。