Я должен был создать что-то, что вам нужно, так вот результат. Задав базовый каталог, вы получите относительный путь к файлу, начиная с базового каталога. Функция довольно быстрая, 100 000 проверок заняли 0,64 с. на моем сервере. И это работает как для каталогов, так и для файлов. Это совместимо с Linux. Даже не пытайтесь это сделать на Windows :)
/**
* Return a relative path to a file or directory using base directory.
* When you set $base to /website and $path to /website/store/library.php
* this function will return /store/library.php
*
* Remember: All paths have to start from "/" or "\" this is not Windows compatible.
*
* @param String $base A base path used to construct relative path. For example /website
* @param String $path A full path to file or directory used to construct relative path. For example /website/store/library.php
*
* @return String
*/
function getRelativePath($base, $path) {
// Detect directory separator
$separator = substr($base, 0, 1);
$base = array_slice(explode($separator, rtrim($base,$separator)),1);
$path = array_slice(explode($separator, rtrim($path,$separator)),1);
return $separator.implode($separator, array_slice($path, count($base)));
}
Использование
Вам необходимо получить относительный путь к файлу /var/www/example.com/media/test.jpg
Ваш базовый путь /var/www/example.com
Используйте функцию следующим образом:
$relative = getRelativePath('/var/www/example.com','/var/www/example.com/media/test.jpg');
Функция вернет /media/test.jpg
.
Если вам нужна только часть /media
без файла, используйте ее следующим образом:
$relative = dirname(getRelativePath('/var/www/example.com','/var/www/example.com/media/test.jpg'));