我对PHP非常陌生,并对用PHP编写的CMS中的某个文件稍作修改。我修改了一个在页面源中使用第一个<img>
标记的函数,从该源获取随机标记。
用于匹配源的正则表达式是:
$regex = '/<' . $tag . '\\b[^>]*>/i';
其中$tag
只包含字符串img
。
但是我注意到在源代码中有src
属性包含“1px.gif”的图像,我不想匹配这些图像。
目前我不断从匹配数组中重新选择一个随机元素,直到它不是1px.gif,但当然这是一个糟糕的解决方案。
我对正则表达式做得不够好,但我理解上面的正则表达式搜索<img
和一个不是>
的单词字符。我需要添加“并且不包含'1px.gif'”。
我可以选择检查匹配数组并删除每个1px.gif的条目,但我更喜欢正则表达式。
答案 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
的所有图片。从那以后,获得随机节点非常容易。