Expression régulière cdata

Résolu
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010 - 21 janv. 2010 à 16:40
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 - 26 janv. 2010 à 17:30
bonjour à tous
j'ai besoin d'encadrer les informations d'un document XML par des CDATA. Pour l'instant, j'en suis là :
$xml = "<xml><test>id</test><test2>perso</test2><test3/></xml>";
 
$xml = preg_replace("#(<[^/>]+>)#i", "$1<![CDATA[", $xml);
$xml = preg_replace("#(</[^>]+>)#i", "]]>$1", $xml);

echo "<xmp>".$xml."</xmp>";

Cela retourne :
<xml><![CDATA[<test><![CDATA[id]]></test><test2><![CDATA[perso]]></test2><test3/>]]></xml>
au lieu de :
<xml><test><![CDATA[id]]></test><test2><![CDATA[perso]]></test2><test3/></xml>
Le problème c'est que j'ai un CDATA qui se place sur la balise "<xml>" alors qu'il faut que ce soit uniquement sur les feuilles de mon arbre XML.
Avez-vous une idée?
Merci d'avance de votre réponse!

9 réponses

Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
25 janv. 2010 à 20:51
Faudrait juste mieux définir les caractères permis dans les balises. Présentement il pense que ceci est une balise :

<xml><test>   <re>id</re></test><test2>< 10</test2><test3/></xml>


Sans tester je te dirait que rapidement ceci devrait faire l'affaire :

<?php
$xml = "<xml><test>   <re>id</re></test><test2>< 10</test2><test3/></xml>";
 
$xml = preg_replace("#(<[^/>]+>)(?!\s*<[a-zA-Z0-9]+?>)(.*?)(</[^>]+>)#i", "$1<![CDATA[$2]]>$3", $xml);

echo "<xmp>".$xml."</xmp>";
?>
3
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
21 janv. 2010 à 17:00
Bon, j'ai avancé car la solution partielle en une ligne semble être :
echo "<xmp>".preg_replace("#(<[^/>]+>)([^<>]+)(</[^>]+>)#i", "$1<![CDATA[$2]]>$3", $xml)."</xmp>";
Cependant si je change l'exemple en
$xml = "<xml><test>id</test><test2>prix > 10</test2><test3/></xml>";
le résultat retourné est :
<xml><test><![CDATA[id]]></test><test2>prix > 10</test2><test3/></xml>
au lieu de :
<xml><test><![CDATA[id]]></test><test2>><![CDATA[prix > 10]]></test2><test3/></xml>
au piste pour m'aider à terminer ce petit script?
merci d'avance !
0
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
22 janv. 2010 à 04:00
Si ton xml garde une struture à 1 niveau seulement tu peux rajouter une condition dans ton regexp pour qu'il ignore ta balise "root" et le reste va bien fonctionner.

<?php
$xml = "<xml><test>id</test><test2>perso</test2><test3/></xml>";
 
$xml = preg_replace("#(?!<xml>)(<[^/>]+>)(.*?)(</[^>]+>)#i", "$1<![CDATA[$2]]>$3", $xml);

echo "<xmp>".$xml."</xmp>";
?>
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
22 janv. 2010 à 08:49
Salut!
Mon XML de sortie peut avoir plusieurs niveaux ... il faut donc que ce soit toutes les feuiles de mon arbre qui prennet un CDATA !
Une idée?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
22 janv. 2010 à 19:17
Hum, j'ai regardé ça un peu plus et ceci devrait faire l'affaire :

<?php
$xml = "<xml><test>   <re>id</re></test><test2>prix > 10</test2><test3/></xml>";
 
$xml = preg_replace("#(<[^/>]+>)(?!\s*<.*?>)(.*?)(</[^>]+>)#i", "$1<![CDATA[$2]]>$3", $xml);

echo "<xmp>".$xml."</xmp>";
?>


En gros, j'ai rajouté une condition pour le contenu de la balise, si ça commence par une balise, la balise sera ignoré. D'ailleurs dans ce genre de situation c'est les "assertions" (j'ignore s'il existe un terme français pour ça) qui sont utilisés.
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
25 janv. 2010 à 10:43
Désolé de pas avoir répondu plus tôt, je bosse pas le WE ;)
En tout cas là, je dis bravo monsieur !!! C'est nickel :p
Ca mérite un "résolu" et un "GROS MERCI"!
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
25 janv. 2010 à 16:11
Je vais encore t'embêter ... Je crois que c'est le dernier défi car je n'ai plus que ça qui bloque apparemment :)

J'ai le cas suivant :

<?php
$xml = "<xml><test>   <re>id</re></test><test2>< 10</test2><test3/></xml>";
 
$xml = preg_replace("#(<[^/>]+>)(?!\s*<.*?>)(.*?)(</[^>]+>)#i", "$1<![CDATA[$2]]>$3", $xml);

echo "<xmp>".$xml."</xmp>";
?>

Comme tu remarqueras le "< 10" n'est pas encadré par CDATA :( J'ai beau essayer de modifier l'expression j'y arrive pas :p J'ai vraiment besoin de tes talents !
Merci d'avance.
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
26 janv. 2010 à 09:21
Ca me semble pas mal tout ça :) Merci beaucoup !
Une petite dernière question pour ma culture perso! Est-il possible de faire que chose du style :
$xml = preg_replace("#(<[^/>]+>)(?!\s*<[a-zA-Z0-9]+?>)(.*?)$1#i", "$1<![CDATA[$2]]>$3", $xml);
pour utiliser le paramètre $1 dans l'expression a gauche!
0
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
26 janv. 2010 à 17:30
Non les variables $1, $2, etc. sont associées au résultat de la recherche. Tu ne peux pas les utilisés avant que la recherche soit faite.
0