Bonjour à tous !
Ca fait maintenant une journée que je me prends la tête avec une Regex que je n'arrive pas à faire fonctionner. Je m'en remets donc à vous !
Le but est simple. Je suis en train de faire un parser XML basé sur les expressions régulières. Certains me diront peut-être que ce n'est pas la meilleure solution mais là n'est pas la question.
Le bout de code qui me pose problème se présente comme ceci :
Code XML : Sélectionner tout - Visualiser dans une fenêtre à part <Script ScriptName="throughput_SDSL_2_acces_10" Protocol="RTP" ServiceQuality="" VoIPCodec="" />
Dans cette chaîne de caractère, plusieurs problèmes se présentent :
- Les attributs "Protocol", ServiceQuality" et "VoIPCodec" peuvent être vides;
- Ces mêmes attributs peuvent ne pas être présents.
C'est ça qui me pose problème !
Pour le moment, ma Regex se présente me ça :
Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <?php preg_match_all("#<Script ScriptName=\"([a-zA-Z0-9_.]+)\" (Protocol=\"([A-Z]*)\")? (ServiceQuality=\"(.*)\")? (VoIpCodec=\"(.*)\")? />#sU", $Pair[0][$j], $Script) ?>
Basons nous sur l'attribut Protocol pour expliquer mon problème (les deux suivants étant gérés de la même façon)
Comme vous pouvez le voir, dans un premier temps je recherche ce qu'il se trouve entre ScriptName=" et ". Jusque là, pas de problèmes.
Viens ensuite la recherche de Protocol. Il faut à la fois que j'identifie ce qu'il se trouve entre Protocol=" et " et que je précise que l'ensemble peut ne pas exister. J'ai donc deux paires de parenthèses capturantes. La première vérifie si l'ensemble existe (grâce à (Mon_contenu)?) et la seconde regarde s'il y a du texte dans l'attribut (grâce à ([A-Z]*)).
La Regex match bien, elle trouve ce que je veux, à une seule condition : il faut que tous les attributs soient présents ! S'il en manque un comme ceci par exemple (j'ai enlevé le VoIpCodec):
J'aurais le droit à une belle erreur. Je ne match pas.
Code XML : Sélectionner tout - Visualiser dans une fenêtre à part <Script ScriptName="throughput_SDSL_2_acces_10" Protocol="RTP" ServiceQuality="" />
Le ? qui englobe un attribut ne semble donc pas fonctionner.
Je me demande donc ce que je peux faire pour réussir à obtenir le résultat que je souhaite !
PS : Merci aux courageux qui sont allés jusqu'au bout !
Partager