Les archives de FluxBB.fr
Vous n'êtes pas identifié(e).
Rien à voir v'ec PunBB...
'ai une chaine qui contient des blocs d'instructions, ces blocs peuvent avoir de multiples formes:
[c][instruction]
[instruction:(*)]
[instruction:("parametre":"valeur")]
[instruction:("parametre":"valeur","parametre2":"valeur2")][/c]
dans une chaîne, il peut y avoir plusieurs blocs, je dois les avoir 1 par 1...
j'ai déjà réussi à faire quelque chose de fonctionel avec:
[c]preg_match_all('/\[(\w+):\((.*)\)\]/U',$string,$regs,PREG_SET_ORDER);[/c]
qui me retourne des tableaux de trois éléments:
[c][0] => Array
(
[0] => [instruction:("parametre":"valeur","parametre2":"valeur2")]
[1] => instruction
[2] => "parametre":"valeur","parametre2":"valeur2"
)[/c]
je défini les "instructions", je suis donc assuré qu'aucune ne contient "[c])][/c]"... mais pas les "parametres" et les "valeurs"!
Si une de ces deux valeurs avait le malheure de contenir "[c])][/c]", le programme le traite comme la fin du bloc...
Il est important pour moi de passer en 2 étapes:
-séparation instruction/parametres
-traitement des paramètres
Voilà, si vous pouviez m'aider, vous me sortiriez d'un casse tête sur le quel je me casse la tête depuis toute la soirée 
Merci d'avance 
Dernière modification par Babs (01-01-2007 23:30:52)
Hors ligne
je regarde ton truc mais uestion con : tu lis une CSS avec ta regexp ?
si ta question c'est "comment je fais pour etre sur de ne pas avoir de )] dans mes parm/valeurs "
reponse : à la place de .* (qui avale tout le reste de la ligne) tu mets [^)]] ou [^\)\]]
ui va dire "tout ce que n'est pas un ) ni un ] "
ca donne
avant :
((.*)\)\]
apres :
(([^\)\]]+)\)\]
TIPS : le (.*) dit "prend tout" et dès qu'on lui met un pattern de plus derriere ; le moteur de regexp "rend" ce qui a trop ete "avale".
Dernière modification par foxmask (02-01-2007 01:05:01)
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
et en francais sa donne quoi :malade:
Cordialement
Hors ligne
Non, je lis une chaîne qui ressemble à:
[c][instruction] [instruction:("valeur")] [instruction:(*)] [instruction:("nom":"1","nom2":"2","nom3":"oui[(non)]")] [instruction:("15","20")][/c]
si ta question c'est "comment je fais pour etre sur de ne pas avoir de )] dans mes parm/valeurs "
C'est pas ça... je voudrais que mon "parser" continue son chemin si il croise un )] entre " " 
Un détail: pcre est en mode PCRE_UNGREEDY 
TIPS: j'ai pas compris ton tips 
Dernière modification par Babs (02-01-2007 10:55:27)
Hors ligne
pour un moteur d'expression rationelle ; le pattern (.*) lui dira de prendre une chaine entiere depuis la partie la plus à droite vers la gauche.
. = un caractere
* = 0 fois ou plus
ce pattern est dit gourmand car il prend toujours tout pour ensuite "rendre" lettre par lettre qd le cas s'impose comme par exemple :
(.*)mask pour trouver foxmask, le moteur "rend" ce qu'il avait trop pris de foxmask c'est à dire mask pour ne garder que fox.
@Babs :donc j'ai fait l'inverse avec ma regexp 
donc il faut que tu dises à ton expression rationnelle de traiter les )] entre " " comme valides.
et si [(mot)] est toujours ecrit comme ca (et pas [(une phrase avec des trucs dedans )]) c'est encore mieux de faire un pattern dessus.
genre :
\w+(\[\(\w+\)\])*
traitera :
1) oui[(non)]
2) oui
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
ben le but c'est que je rentre une chaîne:
[instruction] [instruction:(*)] [instruction:("parametre":"valeur")] [instruction:("parametre":"valeur","parametre2":"valeur2")] [instruction:("valeur","valeur2"]et que je récupère:
Array (
[instruction] =>
[instruction] => *
[instruction] => Array (
[parametre] => valeur
)
[instruction] => Array (
[parametre] => valeur
[parametre2] => valeur2
)
[instruction] => Array (
[0] => valeur
[1] => valeur2
)
)Hors ligne
Babs : tu me laisse la journée et je fais ca en dilétente 
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
ça ne sera sûrement pas la peine 
J'ai eu une réponse qui fonctionne 
Merci quand même pour ton aide 
Dernière modification par Babs (02-01-2007 11:28:49)
Hors ligne
fais péter la regexp pour le plaisir des yeux 
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
Voilà un autre test :
$string = '[instruction]';
$string .= ' [instruction:(*)]';
$string .= ' [instruction:("parametre":"valeur")]';
$string .= ' [instruction:("parametre":"valeur","parametre2":"valeur en
plusieur mot")]';
$string .= ' [instruction:("parametre":"valeur","parametre2":"valeur en
)] mot")]';if (preg_match_all("/\[(\w+) (?: : \( ( \* | (?:\"\w+\":\"[^\"]+\")
(?:,\"\w+\":\"[^\"]+\")* ) \) )? \]/x", $string, $regs, PREG_SET_ORDER)) {
foreach ($regs as $reg) {
echo "<br />instruction = " ,$reg[1];
if ($reg[2]) {
if (preg_match_all("/,?(\"(\w+)\":\"([^\"]+)\")/", $reg[2],
$params, PREG_SET_ORDER)) {
foreach ($params as $param) {
echo "<br /> paramètre = ", $param[2];
echo "<br /> valeur = ", $param[3];
}
}
else echo '<br /> paramètres : ', $reg[2];
}
else echo '<br /> aucun paramètre';
}
}
else echo '<br /> erreur de codage';Résultat :
instruction = instruction
aucun paramètre
instruction = instruction
paramètres : *
instruction = instruction
paramètre = parametre
valeur = valeur
instruction = instruction
paramètre = parametre
valeur = valeur
paramètre = parametre2
valeur = valeur en plusieur mot
instruction = instruction
paramètre = parametre
valeur = valeur
paramètre = parametre2
valeur = valeur en )] mot
Hors ligne
Heu... j'ai rien dis... son code il bug... 'prend pas en compte le \"
si la valeur vaut: "valeur \"truc\""
et ben ça marche pas 
Hors ligne
et un cadeau pour la nouvelle année
INDEMODABLE : Maitrise des expressions regulieres 
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
Tu pense vraiment pouvoir me le faire ?
Hors ligne
Heu... j'ai rien dis... son code il bug... 'prend pas en compte le \"
si la valeur vaut: "valeur \"truc\""
et ben ça marche pas
ba c 3x rien à corriger ; ton pote va te la donner la soluce 
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
Tu pense vraiment pouvoir me le faire ?
ba si tu donnes des éléments qu'au fur et à mesure de ce que tu testes ; ca va prendre du temps.
autant faire un cas concret avec tous les trucs "pourris" dedans 
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
dans ce cas, exemple de bloc:
[instruction]
l'instruction est Toujours [c]\w+[/c]
[instruction:(*)]
Si c'est *, c'est rien d'autre... si ce cas est trop dur à coder, je peux m'aranger pour fournir à la fonction [c][instruction:("*")][/c] ce qui correspond à la syntaxe suivante 
[instruction:("valeur1","valeur2 avec des espace", "valeur3 qui contient )]", "valeur 4 qui contient une \"citation\"")]
[instruction:("nom1":"valeur1","nom2":"valeur2 avec des espace","nom3":"valeur3 qui contient )]","nom4":"valeur 4 qui contient une \"citation\"")]
en ligne, ça donne:
[instruction] [instruction:(*)] [instruction:("valeur1","valeur2 avec des espace", "valeur3 qui contient )]", "valeur 4 qui contient une \"citation\"")] [instruction:("nom1":"valeur1","nom2":"valeur2 avec des espace","nom3":"valeur3 qui contient )]","nom4":"valeur 4 qui contient une \"citation\"")]Dernière modification par Babs (02-01-2007 11:42:36)
Hors ligne
Re'
Un bonne partie de OK, il me faut savoir comment combiner [c](?<=\)"[/c] et [c][^"][/c] pour donner: [c]tout caractère qui n'est pas " ou " précédé de \[/c]
Hors ligne
ca veut pas dire ca c'est 2 expressions mais :
1 "regarde apres le \"
2 "tout ce qui n'est pas un guillemet"
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
La 1 c'est pas plutôt "un guillemet précédé d'un anti-slash" ?
Hors ligne
(?<=\) "regarde apres le back slash" (encore que je doublerai le \ plutot)
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
Et comment dire "regarde avant le guillemet si il y a un anti-slash" ?
Dernière modification par Babs (02-01-2007 14:46:03)
Hors ligne
pour le cas 'citation' j'en suis là
$string = '"une \"citation\""';
echo $string . "<br/>";
if (preg_match_all("|\"(?<![^\\\"])(.*)(?=\\\")\"|x", $string, $regs, PREG_SET_ORDER)) {
foreach ($regs as $reg) {
echo "<br />instruction = " ,$reg[1];
}
}(?<!...) = regarde apres que le pattern ... n'est pas celui là
(?=....) = regarde avant le pattern ...
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
si tu as perl sous la main, tapes :
perldoc perlretut
perldoc perlre
http://www.foxmask.info
HaveFnuBB! le seul forum produit avec le framework PHP5 Jelix
(dé)pot de miel
Membre de la CoreTeam Jelix
Hors ligne
Sorry, but...
You need to install the perl-doc package to use this program.
Hors ligne
Hors ligne