2013-04-03 168 views
1

如何獲得文件的絕對路徑,而沒有遵循符號鏈接。PHP獲得絕對路徑,但沒有遵循符號鏈接

E.g.

/path/to/some/file 
/path/to/some/link -> /path/to/some/file 
/path/to/some/directory/ 

我當前的工作目錄是/path/to/some/directory/我去realpath('../link)返回/path/to/some/file

(我知道realpath應該以這種方式工作)

是否有一個函數,而不是realpath,將返回/path/to/some/link

+0

假設PHP將正確處理'/ path/to/some/directory /../ link'我懷疑那裏有一個函數。我可能是錯的,但你最好的選擇是寫你自己的。 – jolt

+0

是否有你不能使用'__DIR__的原因。 「/../ link''? –

+0

@Jack沒有,因爲路徑不是相對於PHP文件。 – Petah

回答

2

這裏還有getcwd();我經常使用。語法更簡單。

+0

'chdir($ dir); echo getcwd();'這比用戶定義的路徑解析函數好得多。謝謝! – chiliNUT

2

David Beck寫了一個解決方案,清理相關路徑組件,而不必訪問PHP手冊的註釋部分中的實際文件系統。唉,他忘了給函數添加return聲明,但如果這是你需要的,它似乎很好用。也適用於URL。

function canonicalize($address) 
{ 
    $address = explode('/', $address); 
    $keys = array_keys($address, '..'); 

    foreach($keys AS $keypos => $key) 
    { 
     array_splice($address, $key - ($keypos * 2 + 1), 2); 
    } 

    $address = implode('/', $address); 
    $address = str_replace('./', '', $address); 

    return $address; 
} 

$url = '/path/to/some/weird/directory/../.././link'; 
echo canonicalize($url); // /path/to/some/link 
+0

我試過類似的功能,但是它確實找到了相對路徑(例如'../ link'剛剛返回'..')。 – Petah

+0

工作良好,但在「多個地方」有'../'的情況下不會。例子:'/ path/to/some/weird/directory /../../../ link ../'或'/path/to/some/weird/directory/../../../ link..' –