1

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

4

3 回答 3

5

XML/HTML 解析器之类的东西会更好地为您服务。见这里

于 2009-10-31T01:12:40.837 回答
4

这是正则表达式理论上无法处理的一类问题:递归定义的结构。扩展的 RE 可能能够做到这一点,但是(混合隐喻)最好还是选择一个不同的工具。

话虽如此,PCRE 特别具有递归模式特性,典型的演示是\((a*|(?R))*\)它可以处理平衡括号和as 的任意组合。所以你可能可以适应它,但你正在尝试做一些我不会尝试用 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 > 
于 2009-10-31T01:08:40.610 回答
0

您可以使用 XPath 的“轴说明符”“节点集函数”

于 2009-10-31T02:34:56.927 回答