Aller au contenu

Regex et XML


PhpTech

Sujets conseillés

Bonjour,

je travaille actuellement sur un générateur de classes pour PHP, qui permet de générer un code full php5 en utilisant un "catalogue" xml et/ou une bdd.

Le hic, c'est que je n'arrive pas à passer tout le contenu (sans parser le xml, plutôt avec un regex) en minuscule** mais en gardant les la mise en forme des attributs et des valeurs, par exemple, mettre en minuscule tout sauf les soulignés:


<?xml version='[u]1.0[/u]' encoding='[u]UTF-8[/u]'?>
<root>
<package name="[u]FMC[/u]">
<subpackage name="[u]Core[/u]">
<class name="[u]myClass[/u]" description="[u]This is an description.[/u]">
<code><![CDATA[[u]return "I'am a very basic php code";[/u]]]></code>
</class>
</subpackage>
</package>
</root>

Je n'ai trouver qu'une solution arbitraire en utilisant preg_replace, mais celle-ci ne fonctionne pas parfaitement,

j'espere m'être correctement exprimé, et que vous pourrez me conseiller, merci à tous ;)

(** : Je désires passé le tout en minuscule pour éviter les erreurs liées au formatage)

[Edit]

Juste pour info, j'ai le cerveau qui bouillone mais j'ai trouvé la solution, je la laisse ici, si elle peut service à quelqu'un ;)


$xml = file_get_contents($this->_filename);
$xmlUp = $xml;
$xmlCo = array();

if (preg_match_all('/(\'|")(.+?)(\\1)/si', $xml, $xmlCo)) {

$xmlCo = $xmlCo[0];
$xml = str_ireplace($xmlCo, $xmlCo, strtolower($xml));

}

$xmlCo = array();

if (preg_match_all('/<!\\[CDATA\\[.+?]]>/si', $xml, $xmlCo)) {

$xmlCoUp = array();

preg_match_all('/<!\\[CDATA\\[.+?]]>/si', $xmlUp, $xmlCoUp);

$xmlCo = $xmlCo[0];
$xmlCoUp = $xmlCoUp[0];
$xml = str_ireplace($xmlCo, $xmlCoUp, $xml);

}

unset($xmlUp);
unset($xmlCo);
unset($xmlCoUp);

if (false === ($this->_catalog = _AT_simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)) ) {

$this->error("Failed to import the catalog « {$this->_filename} » , bad xml structure.");

}

unset($xml);

Voila :P, un peu de logique, et pas mal de bidouillage :smartass:

[/Edit]

Lien vers le commentaire
Partager sur d’autres sites

Tout dépend si ce traitement doit se faire une seule fois ou si tu as des contraintes de performance mais il me parait assez simple de lire ce fichier xml ligne à ligne, puis de récupérer les infos entre accolades ou entre guillemets.

Par exemple en algo :

$info=lire_ligne($buffer);

$tab_info=explode(' " ',$info);// si tu es sur que c'est du xml, tu sais que toutes les valeurs pairs de $tab_info sont entre guillemets

Il ne te reste plus qu'a remplacer les $tab_info impairs avec strtolower puis tu reconstruis ta ligne et t recommences pour les autres caractères à exploser

mais ca peut etre très gourmand pour chaque ligne après a voir si tu as beaucoup de lignes à traiter ou si c'est juste à la génération du xml.

Si c'est pas très clair : l'heure tardive me donera une excuse...

Ludo

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir ludo88,

merci pour ta réponse, mais plusieurs problèmes se posent avec ta méthode, notamment, au niveau des performances,

ensuite, les guillemets peuvent etres simple ou double, ensuite, il y a aussi le balisage de code (qui peut etre simple ou balisé avec du CDATA), mais merci d'y avoir réflechis avec moi :)

J'aimerais pouvoir trouver le regex idéal, j'ai déjà ca pour les attributs :

preg_replace('/([a-z0-9_-]*)=(\'|")([a-z0-9_-]*)(\\2)/ise', "strtolower('\\1').'=\"\\3\"'", $xml);

mais ca ne fonctionne pas à tous les coups, il y a un probleme au niveau de la détection...

Je continu à chercher, merci pour ta proposition, et si quelqu'un trouve... :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...