有没有办法告诉 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 处停止。
有没有办法告诉 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 处停止。
XML/HTML 解析器之类的东西会更好地为您服务。见这里。
这是正则表达式理论上无法处理的一类问题:递归定义的结构。扩展的 RE 可能能够做到这一点,但是(混合隐喻)最好还是选择一个不同的工具。
话虽如此,PCRE 特别具有递归模式特性,典型的演示是\((a*|(?R))*\)
它可以处理平衡括号和a
s 的任意组合。所以你可能可以适应它,但你正在尝试做一些我不会尝试用 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 >