PHP正则表达式匹配除某些src之外的所有img标记

时间:2013-01-06 17:28:03

标签: php regex xpath html-parsing domdocument

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

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

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

其中$tag只包含字符串img

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

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

我对正则表达式做得不够好,但我理解上面的正则表达式搜索<img和一个不是>的单词字符。我需要添加“并且不包含'1px.gif'”。

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

1 个答案:

答案 0 :(得分:8)

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

<?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');
}

这将获得没有src 1px.gif的所有图片。从那以后,获得随机节点非常容易。

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