Php 正则表达式:有没有办法告诉preg_match_all使用它发现的第三个匹配项跳过前两个?
有没有办法告诉preg_match_all使用它发现的第三个匹配项跳过前两个?例如,我有以下HTMLPhp 正则表达式:有没有办法告诉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的内容,而不是在遇到第一个/
<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}?
的非贪婪版本。是的,对于这个肯定应该使用解析器而不是正则表达式是的,对于这个肯定应该使用解析器而不是正则表达式