Есть ли в PHP встроенный способ разрешения пути относительно другого?
Например, для заданного каталога $baseDir
: /home/ben/project
следующий $path
должен разрешаться в:
/foo/bar
→/foo/bar
../foo/bar
, →/home/ben/foo/bar
Решения, которые приходят на ум:
Временное изменение текущего рабочего каталога и использование
realpath()
:$currentDir = getcwd(); chdir($baseDir); $resolvedPath = realpath($path); chdir($currentDir); return $resolvedPath;
Это решение немного утомительно.
Проверка, является ли путь абсолютным, если нет, с помощью
realpath()
:if ($path[0] === '/') { return $path; } return realpath($currentDir . '/' . $path);
Это решение не является кросс-платформенным; сделать его безопасным кросс-платформенным может быть не так тривиально, как кажется.
И последнее, но не менее важное: realpath()
возвращает false
, когда путь не существует, что не учитывается в приведенных выше кодах и может быть проблемой в некоторых случаях использования.
Я что-то пропустил?
C:\
, а не с/
. А насчёт других ОС я не уверен. - person BenMorel   schedule 01.08.2019/
тоже работает в Windows. Проблема заключается в надежной проверке того, является ли путь абсолютным или относительным. - person BenMorel   schedule 01.08.2019