PHP中的PCRE只能找到模式匹配的第一件事

时间:2011-04-27 02:59:22

标签: php regex pcre

我使用以下模式来匹配HTML标记:

~<([[:alpha:]]+) ([[:alpha:]]+=".*?")*>.*?</\1>~si

它工作正常并且会匹配任何标记,但它只会在整个字符串中搜索它遇到的第一个匹配项。例如:

$text = <<<text
<p class="matches">some text, this will match</p>
<p>this won't match</p>
<p>this won't match either</p>
<p class="matches">this will match</p>
<p class="matches">this will match too</p>
<div>This won't match either but I want it to..</div>
text;

$pattern = '~<([[:alpha:]]+) ([[:alpha:]]+=".*?")*>.*?</\1>~si';
preg_match_all($pattern,$text,$matches);
var_dump($matches);

发布的代码将填充我想要的$ match,但$ matches [0] [*]将只包含具有class =“matches”属性的3个段落(我在没有属性的标签上测试了这个模式,它确实也适合那些)。 Rexexp不是我的强项......我做错了什么?

1 个答案:

答案 0 :(得分:1)

在元素和属性匹配

之间添加\s?
~<([[:alpha:]]+)\s?([[:alpha:]]+=".*?")*>.*?</\1>~si

另外,你shouldn't be using regex for HTML