【问题标题】:Negative lookup preg_match_all in PHP for IMG tags without ALT attribute没有 ALT 属性的 IMG 标签在 PHP 中的负查找 preg_match_all
【发布时间】:2013-01-30 18:20:49
【问题描述】:

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

我正在尝试使用否定的环视语法:

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

不幸的是没有返回任何东西,而img标签肯定没有alt属性。

我认为问题出在否定查找中,但例如我使用了:

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

从外部资源中搜索图像,效果很好。

你知道第一个表达式有什么问题吗? 谢谢!

【问题讨论】:

  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php.html
  • 我永远不会在生产环境中使用 simple_html_dom,因为它存在内存泄漏。这就是为什么我前一段时间拒绝它并现在使用 nokogiri。这真的取决于是否为此使用正则表达式,就我的目的而言,我认为它很合适。

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


【解决方案1】:

使用前瞻语法适用于第一个语法

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

这里的$matches 将只包含带有alt 的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);
}

?>

【讨论】:

  • 这仍然没有返回任何东西。它对你有用吗?另外据我了解,您使用的是积极的前瞻,但想法是找到那些不包含 alt 属性的标签,所以我使用了消极的前瞻(?!)。
  • 刚刚用工作代码进行了编辑,当然我忘了你想要不包含 alt 的行,所以稍等一下,我会看看我能想出什么
【解决方案2】:

我终于找到了可行的解决方案:

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

感谢您的贡献。

【讨论】:

  • 哇,我完全不明白为什么会这样。为什么这行得通但'@img(?!alt=).*?&gt;@' 行不通?
  • 我并不完全理解所有这些东西,但是您提供的似乎是在 ”之间的任何地方搜索 alt 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多