Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式:有没有办法告诉preg_match_all使用它发现的第三个匹配项跳过前两个?_Php_Preg Match All - Fatal编程技术网

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

Php 正则表达式:有没有办法告诉preg_match_all使用它发现的第三个匹配项跳过前两个?,php,preg-match-all,Php,Preg Match All,有没有办法告诉preg_match_all使用它发现的第三个匹配项跳过前两个?例如,我有以下HTML <div class="entry"> <div class="text">BlaBlaBla</div> <div class="date">2009-10-31</div> </div> 喋喋不休 2009-10-31 我需要preg_match_all来获取最外层div的内容,而不是在遇到第一个/

有没有办法告诉preg_match_all使用它发现的第三个匹配项跳过前两个?例如,我有以下HTML

<div class="entry">
    <div class="text">BlaBlaBla</div>
    <div class="date">2009-10-31</div>
</div>

喋喋不休
2009-10-31

我需要preg_match_all来获取最外层div的内容,而不是在遇到第一个/div时停止

这是正则表达式理论上无法处理的一类问题:递归定义的结构。扩展的RE可能可以做到这一点,但(混合隐喻)最好是用另一种工具来下注

尽管如此,PCRE特别具有递归模式特性,典型的演示是
\((a*|(?R))*\)
,它可以处理平衡参数和
a
s的任意组合。所以你可能可以适应它,但你正在尝试做一些我不会尝试用REs做的事情

更新:我不确定这是否有用,但是:

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 > 
php>$t=“现在是什么时候”;
php>preg_match('/(.*R))*/',$t,$m);印刷费(百万美元);
排列
(
[0]=>现在的时间怎么样
[1] => 
)
php>

这是正则表达式理论上无法处理的一类问题:递归定义的结构。扩展的RE可能可以做到这一点,但(混合隐喻)最好是用另一种工具来下注

尽管如此,PCRE特别具有递归模式特性,典型的演示是
\((a*|(?R))*\)
,它可以处理平衡参数和
a
s的任意组合。所以你可能可以适应它,但你正在尝试做一些我不会尝试用REs做的事情

更新:我不确定这是否有用,但是:

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 > 
php>$t=“现在是什么时候”;
php>preg_match('/(.*R))*/',$t,$m);印刷费(百万美元);
排列
(
[0]=>现在的时间怎么样
[1] => 
)
php>

使用XML/HTML解析器之类的工具会更好。请参阅。

使用XML/HTML解析器之类的工具会更好。请参阅。

您可以使用XPath和

您可以使用XPath和

所以绝对没有办法说“匹配第三个”?关于您的更新:几乎:)它会转到它在整个字符串中看到的最后一个/div,而我需要它在第三个匹配处停止。唉,我不确定我能在RE中做到这一点。您确实需要grok的XPath或DOM或。。某种解析器,有无数种。无论如何,再看看
(pattern){m,n}
的重新语法,它将找到特定数量的匹配项,以及
(pattern){m,n}?
的非贪婪版本。因此,绝对没有办法说“匹配第三个”?关于您的更新:几乎:)它转到它在整个字符串中看到的最后一个/div,但是我需要它在第三场比赛时停下来。唉,我不确定我能在RE的比赛中做到这一点。您确实需要grok的XPath或DOM或。。某种解析器,有无数种。无论如何,还要看看
(pattern){m,n}
的重新语法,它将找到特定数量的匹配项,以及
(pattern){m,n}?
的非贪婪版本。是的,对于这个肯定应该使用解析器而不是正则表达式是的,对于这个肯定应该使用解析器而不是正则表达式