有没有办法告诉preg_match_all使用跳过前两个匹配的第三个匹配?例如,我有以下HTML
<div class="entry">
<div class="text">BlaBlaBla</div>
<div class="date">2009-10-31</div>
</div>
我需要preg_match_all来获取最外层div的内容,而不是在它遇到的第一个/ div处停止。
答案 0 :(得分:5)
像XML / HTML解析器这样的东西会更好。请参阅here。
答案 1 :(得分:4)
这是正则表达式理论上无法处理的问题类:递归定义的结构。扩展的RE可能能够做到这一点,但是(混合比喻)最好是踢它并拿起一个不同的工具。
话虽如此,PCRE特别具有递归模式功能,典型的演示是\((a*|(?R))*\)
,它可以处理平衡的parens和a
的任意组合。所以你可能会适应这种情况,但你正在努力做一些我不会尝试用RE做的事情。
更新:我不确定这会有多大用处,但是:
php > $t = "<div> how <div> now is the time </div> now </div>";
php > preg_match('/<div>(.*|(?R))*<\/div>/',$t,$m); print_r($m);
Array
(
[0] => <div> how <div> now is the time </div> now </div>
[1] =>
)
php >
答案 2 :(得分:0)
您可以使用XPath的"Axis specifiers"和"node set functions"