PHP中的负向查找preg_match_all,用于没有ALT属性的IMG标记

时间:2013-02-14 20:28:17

标签: php regex html-parsing preg-match-all regex-negation

我正在尝试查找不包含img属性的alt标记,以便修复它以进行W3C验证。

我正在尝试使用负面的环顾语法:

preg_match_all('@<img[^>]*?(?!alt=)[^>]*>@', $text, $matches);

,遗憾的是,它没有返回任何内容,而img个标记没有alt属性。

我认为问题出现在负面查找中,但例如我用过:

preg_match_all('@<img[^>]+?http:\/\/(?!mysite\.com)[^>]*?>@', $text, $matches);

从外部资源中搜索图像并且工作正常。

任何想法第一个表达式有什么问题? 谢谢!

2 个答案:

答案 0 :(得分:2)

最后我找到了可行的解决方案:

preg_match_all('@<img(?:(?!alt=).)*?>@', $text, $matches);

感谢您的贡献。

答案 1 :(得分:1)

使用先行语法与第一个语法一起使用

preg_match_all('@<img[^>]*?(?=alt=)[^>]*>@', $text, $matches);

这里的$ matches只包含带有alt&#39的img。

<?php
$str = <<<EOF
<html>
  <body>
    hello
    <img src="withalt" alt="hi"/>asdf
    <img src="noalt" />
    <img src="withalt2" alt="blah" />
  </body>
</html>
EOF;

if (preg_match_all('@<img[^>]*?(?=alt=)[^>]*>@', $str, $matches)) {
   echo "matches\n";
   print_r($matches);
}

?>