【问题标题】:PHP convert external relative path to absolute pathPHP将外部相对路径转换为绝对路径
【发布时间】:2011-02-21 16:02:01
【问题描述】:

我试图弄清楚如何将“外部相对路径”转换为绝对路径: 我真的很想要一个可以执行以下操作的函数:

$path = "/search?q=query";
$host = "http://google.com";
$abspath = reltoabs($host, $path);

并且 $abspath 等于 "http://google.com/search?q=query" 另一个例子:

$path = "top.html";
$host = "www.example.com/documentation";
$abspath = reltoabs($host, $path);

并且 $abspath 等于“http://www.example.com/documentation/top.html

问题是它不能保证是那种格式,它可能已经是绝对的,或者完全指向不同的主机,我不太确定如何处理这个问题。 谢谢。

【问题讨论】:

  • 如果您可以发布您将获得的所有不同形式的路径和主机,或者至少是一个很好的种类,它可能有助于指导这样做。另外,你从哪里得到这些数据?这可能有用:us3.php.net/manual/en/function.parse-url.php
  • 理论上,此内容将是用户生成的,并且可能遍布各处:主机可能是:“google.com”、“google.com/prdhp?hl=en&tab=wf”(即它可以包含路径) 并且需要从此字符串中提取域。路径的范围可以从:“example.com/donuts”到“/testing/n.html”,它需要检测其中是否包含域。
  • 我想我需要澄清我之前的评论,因为有两条数据提供给程序:HOST,它是从中检索 url 的站点,以及 PATH,这是该站点上可能存在也可能不存在的路径,如果它没有指定域,则需要从 HOST 中提取域。

标签: php path external absolute-path


【解决方案1】:

你应该试试 PECL 函数 http_build_url http://php.net/manual/en/function.http-build-url.php

【讨论】:

    【解决方案2】:

    所以分三种情况:

    1. 正确的网址
    2. 无协议
    3. 没有协议也没有域

    示例代码(未经测试):

    if (preg_match('@^http(?:s)?://@i', $userurl))
        $url = preg_replace('@^http(s)?://@i', 'http$1://', $userurl); //protocol lowercase
    //deem to have domain if a dot is found before a /
    elseif (preg_match('@^[^/]+\\.[^/]+@', $useurl)
        $url = "http://".$useurl;
    else { //no protocol or domain
        $url = "http://default.domain/" . (($useurl[0] != "/") ? "/" : "") . $useurl;
    }
    
    $url = filter_var($url, FILTER_VALIDATE_URL);
    
    if ($url === false)
        die("User gave invalid url").
    

    【讨论】:

    • 路径还是主机的三种情况?
    【解决方案3】:

    看来我自己的问题已经解决了:

    function reltoabs($host, $path) {
        $resulting = array();
        $hostparts = parse_url($host);
        $pathparts = parse_url($path);
        if (array_key_exists("host", $pathparts)) return $path; // Absolute
        // Relative
        $opath = "";
        if (array_key_exists("scheme", $hostparts)) $opath .= $hostparts["scheme"] . "://";
        if (array_key_exists("user", $hostparts)) {
            if (array_key_exists("pass", $hostparts)) $opath .= $hostparts["user"] . ":" . $hostparts["pass"] . "@";
            else $opath .= $hostparts["user"] . "@";
        } elseif (array_key_exists("pass", $hostparts)) $opath .= ":" . $hostparts["pass"] . "@";
        if (array_key_exists("host", $hostparts)) $opath .= $hostparts["host"];
        if (!array_key_exists("path", $pathparts) || $pathparts["path"][0] != "/") {
            $dirname = explode("/", $hostparts["path"]);
            $opath .= implode("/", array_slice($dirname, 0, count($dirname) - 1)) . "/" . basename($pathparts["path"]);
        } else $opath .= $pathparts["path"];
        if (array_key_exists("query", $pathparts)) $opath .= "?" . $pathparts["query"];
        if (array_key_exists("fragment", $pathparts)) $opath .= "#" . $pathparts["fragment"];
        return $opath;
    }
    

    就我的目的而言,这似乎工作得很好。

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 2011-11-07
      • 2011-05-02
      • 2016-12-14
      相关资源
      最近更新 更多