2013-04-03 133 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..' –