Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

traitement xml : caracteres interdits ?

14 réponses
Avatar
Olivier Masson
Bonjour,

Il me semblait que l'utilisation de section CDATA permettait de
s'abstraire des problèmes de caractères utilisés.
Or, j'ai une erreur avec simple_xml_file, apparemment dûe à un caractère
étrange ($001D).
Je n'ai pas trouvé les limites de cette commande dans la doc php.
Avez-vous davantage d'infos ?
Merci.

4 réponses

1 2
Avatar
Olivier Masson
Le 07/01/2011 17:32, Olivier Miakinen a écrit :


Plus simple (et moins source d'erreur) :
'/[^x{9}x{A}x{D}x{20}-x{D7FF}x{E000}-x{FFFD}x{10000}-x{10FFFF}]+/u'

Par ailleurs, tu aurais peut-être intérêt à éliminer aussi les
caractères de commande #x7f et #x80 à #x9f, ces derniers étant
parfois produits par une mauvaise conversion de CP1252 en UTF-8 :
'/[^x{9}x{A}x{D}x{20}-x{7E}x{A0}-x{D7FF}x{E000}-x{FFFD}x{10000}-x{10FFFF}]+/u'

Tu peux éventuellement rajouter le #x85 qui est dans la norme, mais vu
que -- à ce que j'ai compris -- il est là pour permettre à EBCDIC d'être
compatible binaire avec UTF-8 (85 = espace), ça doit être plutôt une
bonne chose de le remplacer par une vraie espace ! D'autant que #x85
existe dans CP1252 et représente un caractère fréquent (les points de
suspension).

Enfin, si tu veux être à même de détecter plusieurs caractères
interdits de suite, et de remplacer chacun d'eux par une espace,
tu peux retirer le '+' de la regexp.

Cordialement,



Merci pour ces corrections.
Le |, c'est la belle erreur du "ou" que je colle inutilement...
Très bien pour les autres caractères à éliminer.
Par contre, pour ta dernière remarque, avec le + je devrais détecter
plusieurs caractères interdits de suite mais ils seront remplacés en
groupe par un seul espace, non ? Et c'est bien ce que je souhaite (avoir
une suite d'espace dans un texte n'est pas souhaitable.)
Avatar
Olivier Miakinen
Le 07/01/2011 17:32, je répondais à Olivier Masson :

<cit. http://www.w3.org/TR/REC-xml/#charsets>
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] |
[#x10000-#x10FFFF]
</cit.>



Code utilisé :
$xml =
preg_replace('/[^x{9}|x{A}|x{D}|x{20}-x{D7FF}|x{E000}-x{FFFD}|x{10000}-x{10FFFF}]+/u',
' ', $xmlString);



'/[^x{9}x{A}x{D}x{20}-x{7E}x{A0}-x{D7FF}x{E000}-x{FFFD}x{10000}-x{10FFFF}]+/u'



La définition de Char dans XML 1.1 au lieu de XML 1.0, associée à la
petite note sur fond gris, me permet de proposer une autre regexp.

<cit. http://www.w3.org/TR/xml11/#charsets>
Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

[...]

Note:

Document authors are encouraged to avoid "compatibility characters", as
defined in Unicode [Unicode]. The characters defined in the following
ranges are also discouraged. They are either control characters or
permanently undefined Unicode characters:

[#x1-#x8], [#xB-#xC], [#xE-#x1F], [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF],
[#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF],
[#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF],
[#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF],
[#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF],
[#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF],
[#x10FFFE-#x10FFFF].
</cit.>


D'où :


$EXCLUDE_CHAR /* Control characters (including U+0000 and U+0085) */
'x{0}-x{8}' . 'x{B}x{C}' . 'x{E}-x{1F}' . 'x{7F}-x{9F}' .

/* Surrogates */
'x{D800}-x{DFFF}' .

/* Non characters within Arabic Presentation Forms-A*/
'x{FDD0}-x{FDEF}' . /* FDEF and not FDDF, see errata */

/* Non characters *FFFE and *FFFF */
'x{FFFE}x{FFFF}' . 'x{1FFFE}x{1FFFF}' . 'x{2FFFE}x{2FFFF}' .
'x{3FFFE}x{3FFFF}' . 'x{4FFFE}x{4FFFF}' . 'x{5FFFE}x{5FFFF}' .
'x{6FFFE}x{6FFFF}' . 'x{7FFFE}x{7FFFF}' . 'x{8FFFE}x{8FFFF}' .
'x{9FFFE}x{9FFFF}' . 'x{AFFFE}x{AFFFF}' . 'x{BFFFE}x{BFFFF}' .
'x{CFFFE}x{CFFFF}' . 'x{DFFFE}x{DFFFF}' . 'x{EFFFE}x{EFFFF}' .
'x{FFFFE}x{FFFFF}' . 'x{10FFFE}x{10FFFF}';

$xml = preg_replace('/[' . $EXCLUDE_CHAR . ']/u', ' ', $xmlString);
Avatar
Olivier Miakinen
Le 07/01/2011 19:12, Olivier Masson a écrit :

Par contre, pour ta dernière remarque, avec le + je devrais détecter
plusieurs caractères interdits de suite mais ils seront remplacés en
groupe par un seul espace, non ? Et c'est bien ce que je souhaite (avoir
une suite d'espace dans un texte n'est pas souhaitable.)



Oui, dans ce cas le + se justifie bien.
Avatar
Olivier Masson
Le 07/01/2011 19:12, Olivier Miakinen a écrit :

$EXCLUDE_CHAR > /* Control characters (including U+0000 and U+0085) */
'x{0}-x{8}' . 'x{B}x{C}' . 'x{E}-x{1F}' . 'x{7F}-x{9F}' .

/* Surrogates */
'x{D800}-x{DFFF}' .

/* Non characters within Arabic Presentation Forms-A*/
'x{FDD0}-x{FDEF}' . /* FDEF and not FDDF, see errata */

/* Non characters *FFFE and *FFFF */
'x{FFFE}x{FFFF}' . 'x{1FFFE}x{1FFFF}' . 'x{2FFFE}x{2FFFF}' .
'x{3FFFE}x{3FFFF}' . 'x{4FFFE}x{4FFFF}' . 'x{5FFFE}x{5FFFF}' .
'x{6FFFE}x{6FFFF}' . 'x{7FFFE}x{7FFFF}' . 'x{8FFFE}x{8FFFF}' .
'x{9FFFE}x{9FFFF}' . 'x{AFFFE}x{AFFFF}' . 'x{BFFFE}x{BFFFF}' .
'x{CFFFE}x{CFFFF}' . 'x{DFFFE}x{DFFFF}' . 'x{EFFFE}x{EFFFF}' .
'x{FFFFE}x{FFFFF}' . 'x{10FFFE}x{10FFFF}';

$xml = preg_replace('/[' . $EXCLUDE_CHAR . ']/u', ' ', $xmlString);



Ça devient énorme (comprendre également que ça va bien au-delà de ma
préoccupation de départ) mais au moins c'est générique.
Merci pour ces recherches et ce résultat.
1 2