Bonsoir,
Je viens vers vous en dernier recours.
Mon problème: je dois contrôler les balises d'un fichier qui se presente sous cette forme:
$line='<CM><CA>151264;GSM;N;0:1611021;20060726100000;20060726123000;495020510625278;208200400100004;+33668851302;+0000<Q>DU;CO;S;9000</Q><Q>DU;IM;S;5400</Q><
Q>iiiii</Q><CC>10;256</CC><CC>type2;257</CC></CA><TT>0;-1;20060726100000;0060726123000;20060726100000;1;F</TT><F>GSM;MSC;TS11;MSO;33660000007<EU>T<TV>2006072
6100000;20060726123000;;20820;;MSISDN;+33142235066;+33142235066;00050426</TV><SC>1;2;3</SC><QS>1;2</QS><QS>3;4</QS><CC>20;AUTRE</CC><IC>1;F</IC><Q>MO;VA;EUR;
37.62</Q><Q>DU;VA;S;9000</Q><Q>DU;CO;S;9000</Q><Q>DU;IM;S;5400</Q><Q>MO;IM;EUR;15.048</Q><LV>202;202100;ETU1375;EF202;1;MSO_NAT;706010;706010;1;2006072714322
6;;<NO>GEO;60</NO><I>061611021;102;FORFAIT_PRINCIPAL;2;20060725;20060815;1;20060726100000;0.6;1;0;1;FP202;FFT<PI>1<;2</PI><Q>DU;IM;S;5400</Q><Q>DU;VA;S;5400<
VD>1</VD></Q><Q>DU;CO;S;5400</Q><Q>MO;VA;EUR;22.572</Q></I></LV><LV>202;202HF00;ETU2285;EF202;1;MSO_NAT;706010;706010;1;20060727143226;;E<ERREUR_NO>1;2</NO><
I>061611021;101;HORS FORFAIT;2;20060725;20060815;1;20060726100000;0.4;0;0;1;GSMT1;HF<Q>MO;IM;EUR;15.048</Q><Q>MO;VA;EUR;15.048<VD>1</VD></Q><Q>DU;CO;S;3600</
Q><Q>DU;VA;S;3600</Q></I></LV></EU></F></CM>';
J'analyse toutes les balises pour savoir si elles sont bien présentes et qu'il n'y a pas de cochonnerie au milieu.
Ma regexp donne ça :
1 2 3 4 5 6 7 8 9 10 11 12 13
| if ($line =~ m /^<CM><CA>[^<]+(<Q>[^<]+<\/Q>)+(<CC>[^<]+<\/CC>)+<\/CA><TT>[^<]+<\/TT><F>[^<]+<EU>.<TV>[^<]+<\/TV><SC>[^<]+<\/SC>(<QS>[^<]+<\/QS>)+(<CC>[^<]+<
\/CC>)+<IC>[^<]+<\/IC>(<Q>[^<]+<\/Q>)+(<LV>[^<]+(<NO>[^<]+<\/NO>)+(<I>.*(<PI>.*<\/PI>)?(<Q>.*(<VD>.*<\/VD>)?<\/Q>)+<\/I>)<\/LV>)*/ )
{
print "1:$1\n";
print "2:$2\n";
print "3:$3\n";
print "4:$4\n";
print "5:$5\n";
print "6:$6\n";
print "7:$7\n";
print "8:$8\n";
print "9:$9\n";
} |
Ce qu'il faut savoir c'est que les balises <Q> <CC> <QS> <NO> <LV> peut-être multiple de 1 à N
Le problème survient sur la balise <LV>, qui dans cette exemple est présente deux fois. C'est la seule balise multiple qui contient d'autres balises.
j'ai généré une erreur dans la deuxième <LV> sur la balise <ERREUR_NO>1;2</NO> mais il l'a prends pas en compte car si on regarde le résultat de $6 on voit qu'il recupère directement les deux balises LV
<LV>.....</LV><LV>.......</LV>
$6:<LV>202;202100;ETU1375;EF202;1;MSO_NAT;706010;706010;1;20060727143226;;<NO>GEO;60</NO><I>061611021;102;FORFAIT_PRINCIPAL
;2;20060725;20060815;1;20060726100000;0.6;1;0;1;FP202;FFT<PI>1<;2</PI><Q>DU;IM;S;5400</Q><Q>DU;VA;S;5400
<VD>1</VD></Q><Q>DU;CO;S;5400</Q><Q>MO;VA;EUR;22.572</Q></I></LV><LV>202;202HF00;ETU2285;EF202;1;MSO_NAT;706010;
706010;1;20060727143226;;E<ERREUR_NO>1;2</NO><I>061611021;101;HORS FORFAIT;2;20060725;20060815;1;20060726100000;0.4;0;0;1;GSMT1;HF<Q>MO;IM;EUR;15.048</Q>
<Q>MO;VA;EUR;15.048<VD>1</VD></Q><Q>DU;CO;S;3600</Q><Q>DU;VA;S;3600</Q></I></LV>
Il faut que ma regexp analyse les lignes LV une par une...
Le problème vient de cette partie là:
.... +(<LV>[^<]+(<NO>[^<]+<\/NO>)+(<I>.*(<PI>.*<\/PI>)?(<Q>.*(<VD>.*<\/VD>)?<\/Q>)+<\/I>)<\/LV>)*/
Mais je ne sais plus quoi faire....
Si quelqu'un à des idées... (je bosse en perl et la solution la plus simple serait de contrôler lorsque avec des boucles dans mon code, mais j'aimerais bien réussir cette regexp :p )
Merci d'avance
Partager