2010-01-04 4 views
0

Le document HTML que j'analyse contient des codes de contrôle ASCII. J'ai remarqué que l'analyseur DOMDocument PHP tronque nœuds de texte quand il trouve des caractères de contrôle ASCII dans le nœud, commeComment faire pour que DOMDocument soit sympa avec les caractères de contrôle ASCII?

Device Control 0x13

End of Medium 0x19

File Separator 0x1C

Group Separator 0x1D

Est c'est un bug ou une fonctionnalité? Existe-t-il un moyen pour que DOMDocument agisse autrement? J'ai eu recours à supprimer ces caractères avant le traitement DOM, mais je me demande si c'est la bonne solution.

+0

Je vois que vous avez accepté ma réponse, vous étiez en mesure de configurer l'analyseur comme 1.1? Ou avez-vous utilisé le work-around de préfixe un prologue 1.1? Ou quelque chose de différent? Il serait utile à d'autres personnes avec le même problème si vous pouviez montrer un exemple de code. – kdgregory

Répondre

2

Probablement à la fois un bug et une fonctionnalité.

XML 1.0 est very restrictive sur les caractères de contrôle ASCII qu'il acceptera. Il semble donc que votre DOMDocument essaie de vous protéger de vous-même en tronquant (bien qu'il devrait renvoyer une indication d'un problème, donc je l'appellerais un bug).

XML 1.1 est less restrictive; la seule chose qu'il ne permet pas est NUL. Donc, une solution possible est de configurer votre objet DOMDocument pour qu'il sache qu'il devrait gérer 1.1.


Edit: il looks like vous pouvez passer le numéro de version XML au constructeur DOMDocument (mais je ne suis pas un programmeur PHP, donc je ne sais pas si je lis la documentation correctement).


Édition 2: Je viens de relire votre question, et j'ai réalisé que votre analyse, pas la construction. Si vous préférez un prologue 1.1 valide à l'entrée, cela devrait être une solution de contournement. Ou peut-être en construisant le DOMDocument avec le numéro de version correct, il analysera correctement sans ce prologue.

+0

Même dans XML 1.1, les caractères listés sont RestrictedChar et doivent donc être codés comme des références de caractères plutôt que comme inclus! – bobince

+0

Je ne suis pas sûr que ce soit correct. Je suppose que vous regardez la production 'document', qui contient' (Char * RestrictedChar Char *) '. Cependant, si vous suivez les liens, vous verrez que le chevauchement 'Char' et' RestrictedChar' se chevauchent, et il n'y a aucune mention d'exiger que 'RestrictedChar' soit encodé en tant qu'entité (au moins que je pourrais trouver) - ils sont juste identifié comme "découragé". – kdgregory

+0

C'est un '-' devant' (Char * RestrictedChar Char *) ', ce qui signifie que le document ne doit pas avoir de restriction dans n'importe quel document. En effet, aucun des analyseurs XML que j'ai ici ne touchera un tel document. – bobince

1

Pour ajouter à ce que kdgregory a dit à propos des caractères autorisés, ces caractères de contrôle ne sont pas seulement invalides en XML, mais aussi en SGML. Donc, HTML ou XHTML, vous ne serez jamais capable d'analyser ces caractères dans un document HTML.

(Et je ne sais pas pourquoi vous voulez. Les données binaires ne fait pas partie de [X] [HT] ML.)

+0

Merci. En tout cas, je ne veux pas ajouter ces caractères! J'analyse un document Web que quelqu'un d'autre a créé.Ces caractères ont probablement été collés à partir d'une autre application (Microsoft?) Directement dans l'éditeur Web ou quelque chose de ce genre. – Sleepster

Questions connexes