为什么 PHP 的 DOMDocument 会从处理指令节点中删除前导空格?(<?php ?>)



我正在将一个符合XML的PHP文件加载到DOMDocument中。

    $domDoc = new DOMDocument();
    $domDoc->recover            = TRUE;
    $domDoc->preserveWhiteSpace = TRUE;
    $domDoc->formatOutput       = FALSE;
    $domDoc->substituteEntities = FALSE;
    $domDoc->resolveExternals   = FALSE;

尽管保留了空格并指示它不要格式化输出,但我仍然发现当我使用 $domDoc->saveXML() 保存 XML 时删除了<?php ?>块中的前导空格。

输入:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<?php
// This is code.
// Something else.
    echo 'test';
?>
</html>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<?php // This is code.
// Something else.
    echo 'test';
?>
</html>

我希望输出尽可能与输入相同。折叠属性之间的空格是可以接受的,但在节点之间或处理指令内折叠空格是不行的。为什么 PHP::D OMDocument((/libxml2 会改变 PI 的内容?我是否需要求助于手动 DOM 回显来保持空白完全保留?

PI 节点中的前导空格实际上可以折叠,因为 DOM 认为处理指令的数据部分是:

本处理指令的内容。这是从目标之后的第一个非空格字符到紧接在 ?> 前面的字符。

(强调我的。

preserveWhiteSpace设置仅适用于文本节点,这就是为什么它在这里没有帮助的原因。

无论如何,我建议不要依赖嵌入式PHP被视为处理指令,因为PHP可以包含?>(例如作为字符串文字的一部分(,这将提前终止处理指令。

相关内容

最新更新