报废图像源没有绝对路径

时间:2013-12-13 14:23:41

标签: php regex

我正在尝试从页面获取图像源链接。

部分网页上有图片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;
    }
}

1 个答案:

答案 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>