Dom et caractère < et > ...

Eléphant du PHP | 50 Messages

10 sept. 2008, 19:22

Bonjour,
Je parse actuellement mon texte PHP avec DOM en PHP5. Seulement, je ne sais pas comment me débarrasser d'un bug qui en en fait que si je met une balise autre non fermée ou un < ou un > dans mon texte une erreur apparait.

Merci d'avance,
JC.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
ViPHP | 4039 Messages

10 sept. 2008, 19:38

ah et qu'utilises-tu pour parser ton texte ? et qu'entends-tu par texte php ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 2937 Messages

10 sept. 2008, 19:42

Si ce que tu appelles texte est un fichier XML, sache que les chevrons (< et >) non utilisés pour le balisage doivent être codés selon leur entité (c'est-à-dire, respectivement < et >).

Eléphant du PHP | 50 Messages

10 sept. 2008, 19:52

Reuh !

Merci de vos réponses,
Dans "texte PHP", ce que j'appelle "texte" est un fichier XML en effet^^ et "PHP" est en trop !

Sache que les chevrons (< et >) non utilisés pour le balisage doivent être codés selon leur entité (c'est-à-dire, respectivement < et >).
Mais comment faire pour coder selon leur entité uniquement les balises inutile à mon parsage car j'ai besoin de d'autre balise telle que :

<attention></attention>
<gras></gras>
...

?

Merci d'avance,
JC.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 sept. 2008, 20:14

Mais comment faire pour coder selon leur entité uniquement les balises inutile à mon parsage car j'ai besoin de d'autre balise telle que :

<attention></attention>
<gras></gras>
...

?
Y a-t-il quelqu'un qui a compris cette question ?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 50 Messages

10 sept. 2008, 20:34

Okok je reformule,

En gros j'ai un bug comme dit plus haut avec : < et > et l'on me dit de les remplacer par >...
Mais ma difficulté si je fais ça est qu'il remplacera également les > et < dans mes balises :
<attention></attention>... que je dois garder puisqu'elle font partie de la structure XML (je c'est pas si je me suis fait comprendre cette fois ?)

Dsl,

Merci ++

Mammouth du PHP | 2937 Messages

10 sept. 2008, 20:49

Fais en sorte que ton fichier XML ressemble à ça :

Code : Tout sélectionner

<attention>Il s'agit des balises <attention> et </attention> (comme on peut le constater, cet élément attention ne possède pas d'élément enfant attention)</attention>
Autrement dit, les chevrons < et > qui doivent être affichés tels quels (et non interprétés) doivent être codés comme dans l'exemple ci-dessus. Il en est de même pour l'& (&, pour éviter toute ambiguïté, l'& étant un caractère introduisant une entité).

Soit dit en passant, tu peux utiliser le validateur de balisage du W3C pour vérifier si ton XML est bien formé. ;)

Eléphant du PHP | 50 Messages

10 sept. 2008, 21:08

Lu,

J'avais justement compris tout cela a ton dernier message mais mon problème est que le XML change.
Et que je n'intervient jamais directement dessus. J'aimerai donc connaitre une fonction qui me change les < et > sauf ceux qui font partie de ma structure perso.

Compris ?

++

Mammouth du PHP | 2937 Messages

10 sept. 2008, 21:17

Si le contenu des différents éléments de ton XML y est injecté en PHP, htmlspecialchars() fait des merveilles.

Eléphant du PHP | 50 Messages

10 sept. 2008, 21:28

Arf ! Je ne comprends pas quelque chose ! DSL !

Si j'envoie le XML suivant :

<attention>balbkjdl < jljlkj </attention>, alors il bug a cause du < en trop.

Mais si je le passe par htmlspecialchars(), il me rendra :

<attention>balbkjdl < jljlkj </attention> ou quelque chose dans le genre non ? Et du coup il me semble que la balise <attention> ne marchera plus Vrai ou faux ?

Merci à tous !

++

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 sept. 2008, 23:12

Il y'a peut être une possibilité avec les expression régulières. Sous PHP on peut utiliser la fonction preg_replace()
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 50 Messages

10 sept. 2008, 23:24

Je ne comprends pas, pourquoi devrais-je utiliser preg_replace alors que j'utilise DOM pour éviter en partie celui-ci ?
En plus je trouve étrange qu'il n'y est pas de solution à mon problème puisque DOM sert à parser également des XML entrés par des membres dans les messages des forums par exemple :
<gras>en gras</gras>...
Et je n'ai dan aucun forum de ce type eu de problème avec < ou >.
Il doit donc y avoir un moyen simple, non ? en évitant preg_replace ?

++ et merci encore.

PS : PHP France donne envie de revenir autant pour aider que pour se faire aider. Vous êtes tous très agréables et les réponses arrivent très vite.

Merci à tous !

++

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 sept. 2008, 23:43

Car avant d'utiliser DOM, il faut que la source XML soit correcte, et selon ce que tu as cité comme problématique, franchement ton XML n'est pas valide vu du standard car il ne respecte pas le format.

Je m'explique : selon XML, une balise <truc> ne peut contenir que du texte ou d'autres balises correctement imbriquées ouvertes et fermées et la balise de départ doit se terminer par </truc>
Autrement dit, il ne doit pas y avoir de < ou > disposés n'importe comment au sein d'un élément <truc></truc>
Et ça ne m'étonne pas que DOM n'accepte pas le format de ton XML.

Donc, il faut d'abord corriger le format XML avant de le soumettre à DOM. Et pour ça je t'ai suggéré d'écrire un correcteur avec preg_replace().

Voici un exemple :
<?php 
//XML source
$xml = "<attention>blabla < blabla < blabla > blabla</attention>";

//Décomposition en parties ciblées
preg_match('#(<attention>)(.*)(</attention>)#', $xml, $parties_trouvées); //3 parties reherchées entourées par ()

//Traitement de la partie à modifier : dans notre cas la partie n°2
$partie_remplacée = preg_replace(array('#<#', '#>#'), array('&lt', '&gt'), $parties_trouvées[2]);

//Recomposition de la chaine XML
$xml = $parties_trouvées[1] . $partie_remplacée . $parties_trouvées[3]; 

//Afficher le résultat
echo $xml;
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 50 Messages

10 sept. 2008, 23:51

Ok mais admettons que j'ai une balise <gras></gras> dans attention, comme suit :

<attention><gras></gras></attention>

Si j'ai bien lu ton code ça ne marche pas si ?
Devoir de mémoire : http://voyage-etude-auschwitz.net
Projet de classe réalisé suite à un voyage au camp d'Auschwitz.