La génération du document XML en PHP (caractères d'échappement)
Je suis de la génération d'un document XML à partir d'un script PHP et j'ai besoin d'échapper les caractères spéciaux XML.
Je sais que la liste de caractères doivent être échappés; mais quelle est la bonne façon de le faire?
Devrait les caractères doivent être échappés juste avec la barre oblique inverse (\') ou ce qui est la bonne façon?
Est-il intégré dans la fonction PHP qui peut gérer cela pour moi?
- Vous êtes mauvais, avec de nombreux points de critiquer dans votre bounty description. J'ai essayé de rendre cela visible avec l'existant réponses, j'espère que cela est utile.
- Je n'ai pas de proposer dans ma réponse à utiliser l'API DOM juste pour l'échappement de la chaîne. Je vous suggère de générer l'ensemble de votre document XML à l'aide de l'API. C'est en réponse aux problèmes que vous mentionnez dans votre bounty description.
Vous devez vous connecter pour publier un commentaire.
Utiliser le DOM classes pour générer de l'ensemble de votre document XML. Il va traiter les codages et décodages que nous ne voulons même pas à s'inquiéter.
Edit: Cela a été critiqué par @Tchalvak:
Qui est faux, DOMDocument peut correctement la sortie d'un fragment de ne pas la totalité de ce document:
qui donne:
comme dans:
Voir Démo
xmlentities()
fonction qui utilise le natif de traitement. Probablement a une surcharge, mais alors, c'est probablement la peine de la paix de l'esprit de l'aide d'un natif/l'avenir de la fonctionnalité ainsi.return (new DOMDocument())->appendChild(new DOMText($text))->parentNode->saveHTML();
new DOMDocument('1.0', 'utf-8'))->appendChild(new DOMText($value))->parentNode->saveXml()
. PS: je pense que votre commentaire doit probablement être sa propre réponse.J'ai créé une fonction simple qui s'échappe avec la cinq "des entités prédéfinies" qui sont en XML:
Exemple d'utilisation Démo:
De sortie:
Un effet similaire peut être obtenu en utilisant
str_replace
mais il est fragile en raison de la double-replacings (non testé, non recommandé):"&"
et"&"
éléments de tableau au début, ou bien toutes les autres entités qui sont créés auront leur arobases remplacé trop. Aussi, lestrtr
solution ne semble pas fonctionner du tout.Ce sujet de la
htmlspecialchars()
fonction?Remarque: la
ENT_XML1
indicateur n'est disponible que si vous avez de PHP 5.4.0 ou plus.htmlspecialchars()
avec ces paramètres remplace les caractères suivants:&
(commercial) devient&
"
(double quote) devient"
'
(single quote) devient'
<
(inférieur à) devient<
>
(supérieur à) devient>
Vous pouvez obtenir la table de traduction à l'aide de la
get_html_translation_table()
fonction.ENT_XML1
pour XML codage compatible - au moins pour les versions de PHP 4.3.0 à 5.5.0alpha4. Un simplehtmlspecialchars($input, ENT_QUOTES, $encoding);
fait le travail aussi bien si vous pouvez vivre avec un numérique au lieu d'une entité nommée.Essayé difficile de traiter avec de l'entité XML problème, le résoudre de cette façon:
Afin d'avoir un valide XML final du texte, vous devez échapper à toutes les entités XML et le texte écrit dans le même encodage que le document XML processing-instruction unis (le "codage" dans le
<?xml
ligne). Les caractères accentués n'avez pas besoin d'être échappé aussi longtemps qu'ils sont codés comme le document.Cependant, dans de nombreuses situations tout simplement échapper à la saisie avec
htmlspecialchars
peut conduire à une double codé entités (par exempleé
deviendrait&eacute;
), alors je vous suggère de décodage des entités html en premier:Maintenant, vous devez vous assurer que tous les caractères accentués sont valables dans le codage du document XML. Je vous encourage fortement à toujours coder sortie XML en UTF-8, car pas tous les parseurs XML respecter le document XML processing-instruction de codage. Si votre entrée peut venir d'un jeu de caractères différent, essayez d'utiliser
utf8_encode()
.Il y a un cas spécial, qui est votre entrée peut provenir de l'une de ces codages: ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, et KOI8-R -- PHP traite tous de la même manière, mais il y a quelques légères différences entre eux-dont certains même
iconv()
ne peut pas gérer. Je ne pouvais résoudre ce problème de codage en complémentutf8_encode()
comportement:Si vous avez besoin d'un bon de sortie xml, simplexml est le chemin à parcourir:
http://www.php.net/manual/en/simplexmlelement.asxml.php
Évitement correcte est le moyen de se corriger XML de sortie, mais vous avez besoin pour gérer échapper différemment pour attributs et éléments. (C'est-à Tomas réponse est incorrecte).
J'ai écrit/a volé des Le code Java un temps, que la distinction entre l'attribut et de l'élément s'échapper. La raison en est que l'analyseur XML considère l'ensemble de l'espace blanc spécial, en particulier dans les attributs.
Il doit être facile à port au cours de PHP (vous pouvez utiliser Tomas Jancik de l'approche ci-dessus est appropriée s'échapper). Vous n'avez pas à vous inquiéter au sujet d'échapper étendu des entités si votre aide
UTF-8
.Si vous ne voulez pas de port mon code Java, vous pouvez regarder XMLWriter qui est basé sur les flux et les utilisations libxml de sorte qu'il doit être très efficace.
Vous pouvez utiliser ces méthodes:
http://php.net/manual/en/function.htmlentities.php
De cette façon, toutes les entités (html/xml) sont échappés et vous pouvez mettre votre chaîne à l'intérieur de balises XML
Basé sur la solution de sadeghj le code suivant fonctionné pour moi: