在PHP中从完整的服务器路径剥离文档根目录

在PHP中从完整的服务器路径剥离文档根目录,php,string,Php,String,好的,我定义了一个PHP常量,它指向服务器上的一个文件,如下所示: define('SOME_FILE', str_replace('//', '/', str_replace('\\', '/', dirname(__FILE__) . '/foo-bar.txt'))); SOME_文件将包含一个完整路径+文件名,可用于PHP函数,如include,fopen,等等。现在,如果我想在(X)HTML输出中使用此路径作为URL,我就完了。为此,我需要去掉文档根 通常,99%的PHP环境中都设置

好的,我定义了一个PHP常量,它指向服务器上的一个文件,如下所示:

define('SOME_FILE', str_replace('//', '/', str_replace('\\', '/', dirname(__FILE__) . '/foo-bar.txt')));
SOME_文件
将包含一个完整路径+文件名,可用于PHP函数,如
include
fopen
,等等。现在,如果我想在(X)HTML输出中使用此路径作为URL,我就完了。为此,我需要去掉文档根

通常,99%的PHP环境中都设置了
$\u服务器['DOCUMENT\u ROOT']
,但在配置不当、被用户覆盖甚至丢失的情况下也会发生这种情况

现在我想做的是
define()
另一个基于
SOME_FILE
的PHP常量,它将指向文件的实际URL(文档根路径被剥离)

我知道我可以用
\uuu FILE\uuuuuuu
$\u服务器['SCRIPT\u NAME']
(根据CGI 1.1规范需要SCRIPT\u NAME,但不是DOCUMENT\u ROOT),
strrpos
,和
substr
,用3-4行代码来实现这一点,但我正在寻找一种“一行”解决方案,用于define语句中


我使用PHP5.1.0+。艾米:欢迎

最简单的解决方案可能是为远程URL设置第二组常量

define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT']);
define('ROOT_URL', 'http://domain.com');
define('BLAH_PATH', ROOT_PATH . PATH_SEPARATOR . 'blah.php');
define('BLAH_URL', ROOT_URL . PATH_SEPERATOR . 'blah.php');

嗯。所以我有点作弊。这是一行两句话。我可以只说一句话,但这更难理解。只需在第二条语句中将第一个str_-ireplace替换为$docRoot即可。

是的,这是最简单的,但在某些客户端环境中,我不能指望使用$_-SERVER['DOCUMENT_-ROOT']。这有点不相关,我只是简单地说,为了便于键入,只需将根路径放在那里。我想说的是,当你可以简单地定义一个文档根和根url作为自变量时,为什么要把东西分条等等呢?是的,我知道,但按照我的方式,它可以在任何配置的任何目录中工作。按照您的方式,当您更改主机或移动文件时,您必须更改常量:)我最终使用了我的define和一些函数,这些函数可以剥离文档根(如果检测正确),但您的解决方案仍然很好(但“可移植性”较差)。
    $docRoot = str_ireplace('/', '\\', $_SERVER['DOCUMENT_ROOT']); $f = str_ireplace($docRoot, '', $f);