我正在尝试这个正则表达式模式:
$string = '<div class="className">AlwaysTheSame:</div>Subtitle <br /><span class="anotherClass">entry1</span><span class="anotherClass">entry2</span><span class="anotherClass">entry3</span>';
preg_match_all('|<div class="className">AlwaysTheSame:</div>(.*?)<br />(<span class="anotherClass">(.*?)</span>)*|', $string, $matches);
print_r($matches);
exit;
<span class="anotherClass">entry</span>
不能存在或多次存在,模式似乎与它匹配,无论存在还是不存在都很好地工作,但输出是:
Array
(
[0] => Array
(
[0] => <div class="className">AlwaysTheSame:</div>Subtitle <br /><span class="anotherClass">entry1</span><span class="anotherClass">entry2</span><span class="anotherClass">entry3</span>
)
[1] => Array
(
[0] => Subtitle
)
[2] => Array
(
[0] => <span class="anotherClass">entry3</span>
)
[3] => Array
(
[0] => entry3
)
)
<span...
包含完整的字符串,因此它与我需要的全部匹配,但在Array2和3中,我只得到最后一个数组
如何才能获得输出数组中的所有<span...
,而不仅仅是最后一个?
发布于 2011-02-13 06:20:13
你不能直接这么做,至少在PHP中不能。重复捕获组总是包含它们匹配的最后一个表达式。允许您访问重复组的每个匹配项的The exception is .NET where regex matches have an additional property。此外,Perl 6可以做这样的事情-但不能做PHP。
解决方案:使用
~<div class="className">AlwaysTheSame:</div>(.*?)<br />((?:<span class="anotherClass">(.*?)</span>)*)~
现在,第二个捕获组包含所有<span>
标签。使用另一个正则表达式,您可以提取所有匹配项:
~(?<=<span class="anotherClass">).*?(?=</span>)~
顺便说一句,我使用~
作为正则表达式分隔符--使用|
会让IMO感到困惑。
https://stackoverflow.com/questions/4982684
复制相似问题