我正在尝试从页面获取图像源链接。
部分网页上有图片src='image/abc.png'
,因此我的正则表达式失败了。
我想要做的是:如果没有给出绝对路径,则将子目录路径附加到主URL。
即如果src='image/abc.png
和主网址为http://stackoverflow.com
然后它应该转换为http://stackoverflow.com/image/abc.png
注意:有些用户输入的网址名称为http://stackoverflow.com/
,所以如果我按照上面的方式添加,那么它会给出
http://stackoverflow.com//image/abc.png
这是错误的。
有人可以给我正确的方向来获得完全绝对的图像路径吗?
我的代码;
<?php
function get_logo($html, $url) {
if (preg_match_all('/\bhttps?:\/\/\S+(?:png|jpg)\b/', $html, $matches)) {
echo "First:";
return $matches[0][0];
} else {
if (preg_match_all('~\b((\w+ps?://)?\S+(png|jpg))b~im', $html, $matches)) {
echo "Second: ";
echo $matches[0][0];
return url_to_absolute($url, $matches[0][0]);
//return $matches[0][0];
} else
return null;
}
}
答案 0 :(得分:0)
绝对不要在此任务中使用正则表达式。结合使用 DOMDocument 和 XPath 可以快速完成这项任务,而且语法相当直观。如果任何 src
标记的 <img>
属性没有 start with
您预先声明的域,则修剪 src
值前面的所有正斜杠并将域添加到形成绝对路径。
代码:(Demo)
$html = <<<HTML
<div>
<img src="image/abc.png" alt="test" width="50" height="50">
<img src="http://example.com/image/abc.png" alt="test" width="50" height="50">
<img src="/image/abc.png" alt="test" width="50" height="50">
<iframe src="image/abc.png" alt="test" width="50" height="50"></iframe>
</div>
HTML;
$base = "http://example.com/";
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query("//img[not(starts-with(@src, '$base'))]") as $node) {
$node->setAttribute('src', $base . ltrim($node->getAttribute('src'), '/'));
}
echo $dom->saveHTML();
输出:
<div>
<img src="http://example.com/image/abc.png" alt="test" width="50" height="50">
<img src="http://example.com/image/abc.png" alt="test" width="50" height="50">
<img src="http://example.com/image/abc.png" alt="test" width="50" height="50">
<iframe src="image/abc.png" alt="test" width="50" height="50"></iframe>
</div>