为了在使用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。
答案 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吗?显然,这使得它变得更容易,您不必担心转换。我认为你最好不要试图让它托管而不是处理操作系统的差异。