Archives FluxBB.fr

Les archives de FluxBB.fr

Vous n'êtes pas identifié(e).

#1 01-01-2007 23:30:24

Babs
Membre

[Résolu] regex

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 smile
Merci d'avance wink

Dernière modification par Babs (01-01-2007 23:30:52)

Hors ligne

#2 02-01-2007 00:54:47

foxmask
Lugo

Re : [Résolu] regex

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

#3 02-01-2007 04:38:17

kitten13
Membre

Re : [Résolu] regex

et en francais sa donne quoi :malade:


Cordialement

Hors ligne

#4 02-01-2007 10:16:17

Babs
Membre

Re : [Résolu] regex

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]

foxmask a écrit :

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 " " smile

Un détail: pcre est en mode PCRE_UNGREEDY wink

TIPS: j'ai pas compris ton tips smile

Dernière modification par Babs (02-01-2007 10:55:27)

Hors ligne

#5 02-01-2007 10:56:11

foxmask
Lugo

Re : [Résolu] regex

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 wink
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

#6 02-01-2007 11:06:16

Babs
Membre

Re : [Résolu] regex

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

#7 02-01-2007 11:14:57

foxmask
Lugo

Re : [Résolu] regex

Babs : tu me laisse la journée et je fais ca en dilétente wink


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

#8 02-01-2007 11:19:44

Babs
Membre

Re : [Résolu] regex

ça ne sera sûrement pas la peine ^^
J'ai eu une réponse qui fonctionne smile

Merci quand même pour ton aide wink

Dernière modification par Babs (02-01-2007 11:28:49)

Hors ligne

#9 02-01-2007 11:20:42

foxmask
Lugo

Re : [Résolu] regex

fais péter la regexp pour le plaisir des yeux wink


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

#10 02-01-2007 11:26:02

Babs
Membre

Re : [Résolu] regex

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

#11 02-01-2007 11:27:54

Babs
Membre

Re : [Résolu] regex

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 hmm

Hors ligne

#12 02-01-2007 11:28:08

foxmask
Lugo

Re : [Résolu] regex

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

#13 02-01-2007 11:31:16

Babs
Membre

Re : [Résolu] regex

Tu pense vraiment pouvoir me le faire ?

Hors ligne

#14 02-01-2007 11:31:23

foxmask
Lugo

Re : [Résolu] regex

Babs a écrit :

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 hmm

ba c 3x rien à corriger ; ton pote va te la donner la soluce wink


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

#15 02-01-2007 11:32:32

foxmask
Lugo

Re : [Résolu] regex

Babs a écrit :

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 wink


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

#16 02-01-2007 11:40:57

Babs
Membre

Re : [Résolu] regex

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 wink

[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

#17 02-01-2007 13:39:56

Babs
Membre

Re : [Résolu] regex

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

#18 02-01-2007 13:50:04

foxmask
Lugo

Re : [Résolu] regex

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

#19 02-01-2007 14:14:47

Babs
Membre

Re : [Résolu] regex

La 1 c'est pas plutôt "un guillemet précédé d'un anti-slash" ?

Hors ligne

#20 02-01-2007 14:34:00

foxmask
Lugo

Re : [Résolu] regex

(?<=\)  "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

#21 02-01-2007 14:35:36

Babs
Membre

Re : [Résolu] regex

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

#22 02-01-2007 15:08:44

foxmask
Lugo

Re : [Résolu] regex

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

#23 02-01-2007 15:34:29

foxmask
Lugo

Re : [Résolu] regex

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

#24 02-01-2007 15:51:48

Babs
Membre

Re : [Résolu] regex

Sorry, but...

You need to install the perl-doc package to use this program.

Hors ligne

#25 02-01-2007 15:52:46

Babs
Membre

Re : [Résolu] regex

Hors ligne

Pied de page des forums