2010-05-20 175 views
4

我試圖找出如何「外部相對路徑」轉換爲絕對的: 我真的很喜歡,會做如下的功能:PHP轉換外部相對路徑絕對路徑

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

回答

1

因此,有三種情況:

  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

0

看來我已經解決了我自己的問題:

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

這似乎工作得很好,爲我的目的。