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 だけです。したがって、考えられる解決策の 1 つは、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 に答える