如果是的话Path_To_DocumentRoot/a/b/c.php,应该永远/a/b.
我用这个:
dirname($_SERVER["PHP_SELF"])
Run Code Online (Sandbox Code Playgroud)
但是当它被另一个目录中的另一个文件包含时,它将无法工作.
编辑
我需要一个相对路径来记录root.它在web应用程序中使用.
我发现还有另一个问题存在同样的问题,但尚未接受答案.
Ali*_*xel 25
你有权访问$_SERVER['SCRIPT_NAME']吗?如果你这样做,做:
dirname($_SERVER['SCRIPT_NAME']);
Run Code Online (Sandbox Code Playgroud)
应该管用.否则这样做:
在PHP <5.3:
substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT']));
Run Code Online (Sandbox Code Playgroud)
或PHP> = 5.3:
substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT']));
Run Code Online (Sandbox Code Playgroud)
您可能需要realpath()和str_replace()所有人\才能/使其完全可移植,如下所示:
substr(str_replace('\\', '/', realpath(dirname(__FILE__))), strlen(str_replace('\\', '/', realpath($_SERVER['DOCUMENT_ROOT']))));
Run Code Online (Sandbox Code Playgroud)
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))));
Run Code Online (Sandbox Code Playgroud)
这是一个通用函数,用于获取两个路径之间的相对路径。
/**
* Return relative path between two sources
* @param $from
* @param $to
* @param string $separator
* @return string
*/
function relativePath($from, $to, $separator = DIRECTORY_SEPARATOR)
{
$from = str_replace(array('/', '\\'), $separator, $from);
$to = str_replace(array('/', '\\'), $separator, $to);
$arFrom = explode($separator, rtrim($from, $separator));
$arTo = explode($separator, rtrim($to, $separator));
while(count($arFrom) && count($arTo) && ($arFrom[0] == $arTo[0]))
{
array_shift($arFrom);
array_shift($arTo);
}
return str_pad("", count($arFrom) * 3, '..'.$separator).implode($separator, $arTo);
}
Run Code Online (Sandbox Code Playgroud)
例子
relativePath('c:\temp\foo\bar', 'c:\temp'); // Result: ../../
relativePath('c:\temp\foo\bar', 'c:\\'); // Result: ../../../
relativePath('c:\temp\foo\bar', 'c:\temp\foo\bar\lala'); // Result: lala
Run Code Online (Sandbox Code Playgroud)