0

我正在解析的 HTML 文档包含一些 ASCII 控制代码。我注意到 PHP 的 DOMDocument 解析器在节点内找到 ASCII 控制字符时会截断文本节点,例如

Device Control 0x13

End of Medium 0x19

File Separator 0x1C

Group Separator 0x1D

这是错误还是功能?有没有办法让 DOMDocument 采取其他方式?我在 DOM 处理之前采取了删除这些字符的方法,但我想知道这是否是正确的解决方案。

4

2 回答 2

2

可能既是错误又是功能。

XML 1.0对它接受的 ASCII 控制字符有非常严格的限制。所以看起来你的 DOMDocument 试图通过截断来保护你自己(尽管它应该返回一些问题的指示,所以我称之为错误)。

XML 1.1限制较少;它唯一不允许的是NUL。因此,一种可能的解决方案是配置您的 DOMDocument 对象,以便它知道它应该管理 1.1。


编辑:看起来您可以将 XML 版本号传递给 DOMDocument 构造函数(但我不是 PHP 程序员,所以不知道我是否正确阅读了文档)。


编辑2:我刚刚重读了你的问题,并意识到你的解析,而不是构造。如果您在输入前添加有效的 1.1 序言,那应该是一种解决方法。或者也许通过使用正确的版本号构造 DOMDocument,它会在没有该序言的情况下正确解析。

于 2010-01-04T17:29:48.920 回答
1

补充一下 kdgregory 关于允许字符的说法,这些控制字符不仅在 XML 中无效,而且在 SGML 中也是无效的。因此,旧版 HTML 或 XHTML,您将永远无法解析 HTML 文档中的任何这些字符。

(我不知道你为什么想要。二进制数据不属于 [X][HT]ML。)

于 2010-01-04T17:50:26.493 回答