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


person Petah    schedule 03.04.2013    source источник
comment
Предполагая, что PHP будет правильно обрабатывать /path/to/some/directory/../link, я сомневаюсь, что там есть функция. Я могу ошибаться, но лучше всего будет написать свой собственный.   -  person tomsseisums    schedule 03.04.2013
comment
Есть ли причина, по которой вы не можете использовать __DIR__ . '/../link'?   -  person Ja͢ck    schedule 03.04.2013
comment
@ Джек нет, потому что путь не относится к файлу PHP.   -  person Petah    schedule 04.04.2013


Ответы (2)


Дэвид Бек написал решение, очищающее компоненты относительного пути без доступ к фактической файловой системе в разделе комментариев руководства по 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
person Kaivosukeltaja    schedule 03.04.2013
comment
Я пробовал аналогичную функцию, но она находит абсолютный путь из относительного (например, ../link просто возвращает ..). - person Petah; 04.04.2013
comment
Работает хорошо, но не в тех случаях, когда у вас есть ../ в нескольких местах. Пример: /path/to/some/weird/directory/../../../link../ или /path/to/some/weird/directory/../../../link.. - person Daniel Omine; 11.01.2016

есть также getcwd();, который я использую довольно часто. Синтаксически проще.

person Community    schedule 03.04.2013
comment
chdir($dir);echo getcwd(); это намного лучше, чем определяемая пользователем функция разрешения пути. Благодарю вас! - person chiliNUT; 21.11.2014