【问题标题】:PHP regex to match all img tags except for certain src [closed]PHP正则表达式匹配除某些src之外的所有img标签[关闭]
【发布时间】:2012-12-20 12:29:57
【问题描述】:

我对 PHP 非常陌生,并且对用 PHP 编写的 CMS 中的某个文件进行了轻微修改。我修改了一个函数,该函数在页面源中获取第一个 <img> 标记,以从该源获取随机标记。

用于匹配源的正则表达式是:

$regex = '/<' . $tag . '\\b[^>]*>/i';

其中$tag 只包含一个字符串img

但是我注意到,在源代码中有 src 属性包含“1px.gif”的图像,我不想匹配这些。

目前我一直从匹配数组中重新选择一个随机元素,直到它不是 1px.gif,但这当然是一个糟糕的解决方案。

我自己的正则表达式还不够好,但我知道上面的正则表达式搜索&lt;img 和一个不是&gt; 的单词字符。我需要添加“并且不包含'1px.gif'”。

我可以选择检查匹配数组并删除每个 1px.gif 条目,但我仍然更喜欢正则表达式。

【问题讨论】:

  • 你能举一些例子说明你想匹配什么不匹配吗?
  • @MikeB 我知道不鼓励使用正则表达式,但我不能简单地在网络服务器上安装 PHP 扩展,例如 Simple HTML DOM Parser,因为我真的不知道如何使用 CMS我正在使用...
  • @abhi.gupta200297 很简单,我想匹配 all img 标签 except 其中src 属性包含序列1px.gif
  • 一个不是简单地用正则表达式解析 HTML。

标签: php regex xpath html-parsing domdocument


【解决方案1】:

您应该使用 DOMDocument 来获取您需要的数据,而不是使用一些损坏的解决方案(正则表达式无法解析 HTML)。一个例子是:

<?php
$html = '<p>something</p><img src="something"><img src="yay"><img src="1px.gif">';

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html);

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//img[not(contains(@src, "1px.gif"))]');

foreach ($nodes as $node) {
    echo $node->getAttribute('src');
}

这将获取所有没有src1px.gif 的图像。从那里开始,很容易得到一个随机节点。

演示:http://codepad.viper-7.com/UdEiM4

【讨论】:

  • 感谢您的建设性回答,像我这样的 PHP 菜鸟可以理解。我一开始就有整个页面源代码,但我不知道如何将其转换为 DOMDocument 对象,现在我知道了(没想到这么简单)。
  • API 非常简单,一旦您了解它。 xpath 查询可能需要一些时间来熟悉,但一旦你了解它,你就会发现它非常强大和有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多