Как получить относительный каталог независимо от того, где он включен в PHP?

Если это Path_To_DocumentRoot/a/b/c.php , всегда должен быть /a/b .

Я использую это:

 dirname($_SERVER["PHP_SELF"]) 

Но он не будет работать, когда он будет включен другим файлом в другом каталоге.

РЕДАКТИРОВАТЬ

Мне нужен относительный путь к документу root. Он используется в веб-приложении.

Я нахожу, что есть еще один вопрос с той же проблемой, но ответа пока нет.

PHP – конвертировать путь к файловой системе в URL

У вас есть доступ к $_SERVER['SCRIPT_NAME'] ? Если вы это сделаете, выполните:

 dirname($_SERVER['SCRIPT_NAME']); 

Должно сработать. В противном случае выполните следующее:

В PHP <5.3:

 substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT'])); 

Или PHP> = 5.3:

 substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT'])); 

Возможно, вам понадобится realpath() и str_replace() все \ to / чтобы сделать его полностью переносимым, например:

 substr(str_replace('\\', '/', realpath(dirname(__FILE__))), strlen(str_replace('\\', '/', realpath($_SERVER['DOCUMENT_ROOT'])))); 

PHP <5.3:

dirname(__FILE__)

PHP> = 5.3:

__DIR__

РЕДАКТИРОВАТЬ:

Вот код, чтобы получить путь к включенному файлу относительно пути запуска php-файла:

  $thispath = explode('\\', str_replace('/','\\', dirname(__FILE__))); $rootpath = explode('\\', str_replace('/','\\', dirname($_SERVER["SCRIPT_FILENAME"]))); $relpath = array(); $dotted = 0; for ($i = 0; $i < count($rootpath); $i++) { if ($i >= count($thispath)) { $dotted++; } elseif ($thispath[$i] != $rootpath[$i]) { $relpath[] = $thispath[$i]; $dotted++; } } print str_repeat('../', $dotted) . implode('/', array_merge($relpath, array_slice($thispath, count($rootpath)))); 

Я должен был создать что-то, что вам нужно, вот результат. Предоставляя базовый каталог, вы получаете относительный путь к файлу, начиная с базового каталога. Функция довольно быстро, 100 000 чеков взяли 0,64 с. на моем сервере. И он работает как для каталогов, так и для файлов. Это совместимо с linux. Даже не пробуйте это на окнах 🙂

  /** * 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')); 

Я знаю, что это старый вопрос, но решения, предлагаемые с помощью DOCUMENT_ROOT, предполагают, что структура веб-папок отражает структуру папок сервера. У меня есть ситуация, когда это не так. Мое решение таково. Вы можете определить, как адрес сервера сопоставляется с веб-адресом, если у вас есть пример из тех же папок с отображенными областями. Пока корневой файл php, содержащий этот файл, находится в одной и той же отображаемой области, у вас есть пример.

$ _SERVER ['SCRIPT_FILENAME'] – это адрес сервера этого файла, а $ _SERVER ['PHP_SELF'] – это веб-относительная версия. С учетом этих двух вы можете определить, какая версия вашего файла в Интернете относится к его серверному адресу (__FILE__) следующим образом.

 function getCurrentFileUrl() { $file = __FILE__; $script = $_SERVER['SCRIPT_FILENAME']; $phpself = $_SERVER['PHP_SELF']; // find end of section of $file which is common to $script $i = 0; while($file[$i] == $script[$i]) { $i++; } // remove end section of $phpself that is the equivalent to the section of $script not included in $file. $phpself = substr($phpself, 0, strlen($phpself)-(strlen($script)-$i)); // append end section of $file onto result $phpself .= substr($file, $i, strlen($file)-$i); // complete address return $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$phpself; }