正则表达式:有没有办法告诉preg_match_all使用跳过前两个匹配的第三个匹配?

时间:2009-10-31 01:03:28

标签: php preg-match-all

有没有办法告诉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处停止。

3 个答案:

答案 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"