PHP转换外部相对路径绝对路径

问题描述:

我试图找出如何“外部相对路径”转换为绝对的: 我真的很喜欢,会做如下的功能:PHP转换外部相对路径绝对路径

$path = "https://*.com/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

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

+0

如果你可以张贴所有不同形式的路径和主机,你会得到的,或者至少有好多种,它可能会帮助做到这一点的方向。另外,你在哪里获得这些数据? 这可能是有用的:http://us3.php.net/manual/en/function.parse-url.php – 2010-05-20 01:47:35

+0

理论上,这个内容将由用户生成,并可能遍布各地: The主机可能是:“google.com”,“http://www.google.com/prdhp?hl=en&tab=wf”(即它可能包含路径),并需要从该字符串中提取域。 路径的范围可以从“example.com/donuts”到“/testing/n.html”,它需要检测域是否在其中。 – skeggse 2010-05-20 01:50:50

+0

我想我需要澄清我以前的评论,因为有两个数据给程序:主机,这是网站上的网址被检索到,路径,这是一个路径,可能或可能不存在于该网站上,如果它没有指定域名,则该域名需要从主机中提取。 – skeggse 2010-05-20 02:28:12

你应该尝试的PECL功能http_build_url http://php.net/manual/en/function.http-build-url.php

+0

此链接已中断 – 2015-04-14 19:33:28

+0

链接已修复,感谢您的建议 – PerroVerd 2015-05-21 09:13:23

因此,有三种情况:

  1. 正确的URL
  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('@^[^/]+\\.[^/][email protected]', $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"). 
+0

三种路径或主机的情况? – skeggse 2010-05-20 02:20:59

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

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; 
} 

这似乎工作得很好,为我的目的。