我正在解析的 HTML 文档包含一些 ASCII 控制代码。我注意到 PHP 的 DOMDocument 解析器在节点内找到 ASCII 控制字符时会截断文本节点,例如
Device Control 0x13
End of Medium 0x19
File Separator 0x1C
Group Separator 0x1D
这是错误还是功能?有没有办法让 DOMDocument 采取其他方式?我在 DOM 处理之前采取了删除这些字符的方法,但我想知道这是否是正确的解决方案。
我正在解析的 HTML 文档包含一些 ASCII 控制代码。我注意到 PHP 的 DOMDocument 解析器在节点内找到 ASCII 控制字符时会截断文本节点,例如
Device Control 0x13
End of Medium 0x19
File Separator 0x1C
Group Separator 0x1D
这是错误还是功能?有没有办法让 DOMDocument 采取其他方式?我在 DOM 处理之前采取了删除这些字符的方法,但我想知道这是否是正确的解决方案。
可能既是错误又是功能。
XML 1.0对它接受的 ASCII 控制字符有非常严格的限制。所以看起来你的 DOMDocument 试图通过截断来保护你自己(尽管它应该返回一些问题的指示,所以我称之为错误)。
XML 1.1限制较少;它唯一不允许的是NUL。因此,一种可能的解决方案是配置您的 DOMDocument 对象,以便它知道它应该管理 1.1。
编辑:看起来您可以将 XML 版本号传递给 DOMDocument 构造函数(但我不是 PHP 程序员,所以不知道我是否正确阅读了文档)。
编辑2:我刚刚重读了你的问题,并意识到你的解析,而不是构造。如果您在输入前添加有效的 1.1 序言,那应该是一种解决方法。或者也许通过使用正确的版本号构造 DOMDocument,它会在没有该序言的情况下正确解析。
补充一下 kdgregory 关于允许字符的说法,这些控制字符不仅在 XML 中无效,而且在 SGML 中也是无效的。因此,旧版 HTML 或 XHTML,您将永远无法解析 HTML 文档中的任何这些字符。
(我不知道你为什么想要。二进制数据不属于 [X][HT]ML。)