我使用以下模式来匹配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不是我的强项......我做错了什么?
答案 0 :(得分:1)
在元素和属性匹配
之间添加\s?
~<([[:alpha:]]+)\s?([[:alpha:]]+=".*?")*>.*?</\1>~si