PHP文件URI的绝对路径

时间:2009-11-16 15:14:51

标签: php file path uri absolute

为了在使用PHP SimpleXML时引用本地DTD,我需要将绝对路径转换为文件类型URI。例如,将/home/sitename/www/xml/example.dtd转换为file:///home/sitename/www/xml/example.dtd。

在给出的示例中,它很容易,因为所需要的只是在路径前添加“文件”方案。但是,如果出现某种情况,例如其中一个目录名称中有空白,则这不够好。该机制应该适用于Windows或Linux,并允许在目录名称中使用非ASCII字符。

到目前为止设计的代码是:

    $absparts = explode('/', _ALIRO_ABSOLUTE_PATH);
    $driveletter = (0 == strncasecmp(PHP_OS, 'win', 3)) ? array_shift($absparts) : '';
    $filename = $driveletter.implode('/', array_map('rawurlencode', $absparts)).'/xml/'.$filename.'.dtd';
    $href = 'file:///'.$filename;

其中定义的符号是系统根目录的绝对路径(始终带有转发斜杠),DTD位于xml子目录中,名称为$ filename,后跟扩展名.dtd。

这会正常吗?有更好的方法吗?

让我解释一下背景。目的是使用SimpleXML解析XML文档。这是使用带有LIBXML_DTDVALID选项的simplexml_load_string()函数完成的。 XML文档将包含指向主网站的真实URI,但我不想引入到达远程网站的延迟,或者通过请求加载主网站。因此,编辑对DTD的引用以便引用本地机器。但它必须作为URI嵌入到XML文档中的DOCTYPE中。约束不是我的选择,它们隐含在DOCTYPE的规则中,并由SimpleXML函数强制执行。我可以找出文件所在的位置作为绝对路径,但要将其放入DOCTYPE,它必须转换为URI。

3 个答案:

答案 0 :(得分:1)

你试过realpath吗?

答案 1 :(得分:1)

如果您在本地运行PHP,则必须运行Apache之类的服务器。那么为什么需要file://参考?只需使用常规参考。

如果您的脚本位于http://localhost/index.php,则可以在HTML中将该文件称为/xml/example.dtd。或者,如果您要从PHP读取文件,请使用$_SERVER['DOCUMENT_ROOT'] . '/xml/example.dtd'

在这些情况下,相同的代码应该可以在本地计算机和实时服务器上正常工作。


好的,基于你澄清的问题,我有一个想法,你可能做的比你需要的多。我不相信您需要检测Windows,您只需要在文档根目录前加file://(并对URL进行编码)。换句话说,您最终会得到file://C:/My Documents...file:///home/site...

当然,您仍然可以使用HTTP引用而不是文件。就像我上面说的那样,用户将在服务器上运行,因此您应该能够使用$_SERVER变量的各个部分(例如$_SERVER['HTTP_HOST'])来拼凑更具体的URL。

答案 2 :(得分:0)

你真的需要让它成为本地的吗?你不能在网络服务器上托管dtd吗?显然,这使得它变得更容易,您不必担心转换。我认为你最好不要试图让它托管而不是处理操作系统的差异。