如何在PHP中获取<img/>的绝对URL?

时间:2009-12-29 01:57:36

标签: php html

已知src的{​​{1}},以及目标网页的网址,如<img>,如何实现检索图像绝对网址的常规功能?

4 个答案:

答案 0 :(得分:6)

我会:

  1. 检查img URL是否以主机值开头,如果是,则返回它,因为它已经是绝对的
    • 解析网页网址以获取基本主机值
    • 检查img src是否与根目录或目录相关,并根据需要附加到基本主机值。
  2. parse_url()将成为这里的选择功能。我感到很勇敢,所以我为你实现了它:

    function getAbsoluteImageUrl($pageUrl,$imgSrc)
    {
        $imgInfo = parse_url($imgSrc);
        if (! empty($imgInfo['host'])) {
            //img src is already an absolute URL
            return $imgSrc;
        }
        else {
            $urlInfo = parse_url($pageUrl);
            $base = $urlInfo['scheme'].'//'.$urlInfo['host'];
            if (substr($imgSrc,0,1) == '/') {
                //img src is relative from the root URL
                return $base . $imgSrc;
            }
            else {
                //img src is relative from the current directory
                   return 
                        $base
                        . substr($urlInfo['path'],0,strrpos($urlInfo['path'],'/'))
                        . '/' . $imgSrc;
            }
        }
    }
    
    //tests
    
    $host = 'http://test.com/directory/hi.html';
    $imgSrc = '/images/lolcat.jpg';
    echo getAbsoluteImageUrl($host,$imgSrc);
    //echos  http//test.com/images/lolcat.jpg 
    
    $host = 'http://test.com/directory/hi.html';
    $imgSrc = 'images/lolcat.jpg';
    echo getAbsoluteImageUrl($host,$imgSrc);
    //echos  http//test.com/directory/images/lolcat.jpg
    
    $host = 'http://test.com/directory/hi.html';
    $imgSrc = 'http://images.com/lolcat.jpg';
    echo getAbsoluteImageUrl($host,$imgSrc);
    //echos  http://images.com/lolcat.jpg
    

答案 1 :(得分:0)

使用parse_url,您可以执行以下操作:

  1. 将页面网址解析为其部分(方案,域,路径,文件,查询,片段)
  2. 根据img url的方式重建img url的url。
    • Img url以'/'开头,它是一个绝对网址,因此我们构建了像"$scheme://$domain$img_url"
    • 这样的img网址
    • Img url不以'/'开头,所以它是相对的,所以我们构建了像"$scheme://$domain/$path/$img_url"这样的img url。如果img_url是“.././"-style,这也有效,因为这些将由服务器解析。
  3. 您可能还想要排除以方案或域名开头的img网址('xx://'或'xx.xx /')。

答案 2 :(得分:0)

接受的答案没有考虑以//开头的src。这使得该方案根据原点而开放。我认为他们的答案中也缺少一个冒号。这是我的略微修改版本似乎工作正常。请注意,它使用PHP7语法。

function getAbsoluteImageUrl($pageUrl,$imgSrc)
{
    $imgInfo = parse_url($imgSrc);
    var_dump(parse_url($imgSrc));

    if (!empty($imgInfo['host'])) {
        //img src is already an absolute URL
        if (substr($imgSrc,0,2) == '//') {
            return (parse_url($pageUrl)['scheme'] ?? "http") . ":" . $imgSrc;
        } else {
            return $imgSrc;
        }
    }
    else {
        $urlInfo = parse_url($pageUrl);
        $base = $urlInfo['scheme'].'://'.$urlInfo['host'];
        if (substr($imgSrc,0,1) == '/') {
            //img src is relative from the root URL
            return $base . $imgSrc;
        }
        else {
            //img src is relative from the current directory
               return
                    $base
                    . substr($urlInfo['path'],0,strrpos($urlInfo['path'],'/'))
                    . '/' . $imgSrc;
        }
    }
}

答案 3 :(得分:-1)

如果我理解了这个问题,您可以在应用程序根目录中定义APPLICATION_PATH,如下所示,然后使用它:

define('APPLICATION_PATH', realpath(dirname(__FILE__)));
...
<img src="<?php APPLICATION_PATH ?>/path/to/image.png" alt="" />
...