Dom et caractère < et > ...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Dom et caractère < et > ...

par Jeremieca » 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 ?

par sadeq » 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;
?>

par Jeremieca » 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 !

++

par sadeq » 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()

par Jeremieca » 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 !

++

par Victor BRITO » 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.

par Jeremieca » 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 ?

++

par Victor BRITO » 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é. ;)

par Jeremieca » 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 ++

par sadeq » 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 ?

par Jeremieca » 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.

par Victor BRITO » 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 >).

par Berzemus » 10 sept. 2008, 19:38

ah et qu'utilises-tu pour parser ton texte ? et qu'entends-tu par texte php ?

Dom et caractère < et > ...

par Jeremieca » 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]