2011-07-07 143 views
-2

可能重複:
Getting relative path from absolute path in PHP輸入絕對路徑,在PHP返回相對路徑

當包括PHP檔案我經常使用絕對路徑,像

/etc/..../index.php 

正如我如果管理員更改文件的位置,則不要擁有這些服務器可能找不到這些文件。

但是試圖找到更換文件時,每次使用

.. 

正道是一件麻煩事。

有沒有我可以通過一個函數或腳本我

/etc/..../index.php 

爲它返回我可以包括使用相對路徑?

+0

請在發佈前進行搜索。當你寫你的問題時,相關的帖子也會出現。其中有幾個是你的重複。 –

+1

無論如何,如果管理員更改文件的位置,則相對路徑將不起作用。如果要確保在維護結構但路徑已更改(即從測試服務器移至活動時)時保留所有引用,相對路徑才非常有用。 –

回答

1

dirname(__FILE__)返回當前目錄名dirname(dirname(__FILE__))帶你上一級等公司的最佳途徑包括文件

+0

爲了便於閱讀,我建議使用'dirname(__ FILE__)。 '/../''而不是後面的'dirname()' - 調用。由於'.'和'..'是文件夾,因此生成的路徑仍然是絕對路徑。另外PHP5.3引入'__DIR__'作爲'dirname(__ FILE __)'的替代品。 – KingCrunch

+0

感謝您的更新 – Ryan

0

託默勒格Geret'kal是正確的,有在這裏爲你的算法:Getting relative path from absolute path in PHP

由於另一種功能,您可以使用一個由http://iubito.free.fr PHP手冊發佈於2003年:

/** 
* Return the relative path between two paths/Retourne le chemin relatif entre 2 chemins 
* 
* If $path2 is empty, get the current directory (getcwd). 
* @return string 
*/ 
function relativePath($path1, $path2='') { 
if ($path2 == '') { 
    $path2 = $path1; 
    $path1 = getcwd(); 
} 

//Remove starting, ending, and double/in paths 
$path1 = trim($path1,'/'); 
$path2 = trim($path2,'/'); 
while (substr_count($path1, '//')) $path1 = str_replace('//', '/', $path1); 
while (substr_count($path2, '//')) $path2 = str_replace('//', '/', $path2); 

//create arrays 
$arr1 = explode('/', $path1); 
if ($arr1 == array('')) $arr1 = array(); 
$arr2 = explode('/', $path2); 
if ($arr2 == array('')) $arr2 = array(); 
$size1 = count($arr1); 
$size2 = count($arr2); 

//now the hard part :-p 
$path=''; 
for($i=0; $i<min($size1,$size2); $i++) 
{ 
    if ($arr1[$i] == $arr2[$i]) continue; 
    else $path = '../'.$path.$arr2[$i].'/'; 
} 
if ($size1 > $size2) 
    for ($i = $size2; $i < $size1; $i++) 
     $path = '../'.$path; 
else if ($size2 > $size1) 
    for ($i = $size1; $i < $size2; $i++) 
     $path .= $arr2[$i].'/'; 

return $path; 
} 
+0

哇,這是魔術。 – Zurechtweiser

1
__DIR__.'/../../../index.php' 

DIR返回被調用文件的目錄。

+0

5.3之前的'dirname(__ FILE __)'(請參閱@Ryans答案) – KingCrunch