2010-07-09 3 views
0

Hé les gars, question sur regex en PHP!L'expression régulière imprime un sur deux dans le modèle correspondant

Pour le motif donné, un peu comme une syntaxe de terminal shell:

application>function -arg1 value -arg2 value -arg3 value -arg4 value 

Je veux analyser les arguments. Ceci est mon code regex

$command=' -arg1 value -arg2 value -arg3 value -arg4 value '; 

// note the string begins by a space character and ends by a space character 
// now i'm trying to parse arguments 

$cmd->arguments=new \stdClass(); 

preg_replace('`\s-(.*)\s([a-zA-Z0-9-_]*)\s`Ue', 
'$cmd->arguments->$1="$2";',$command); 

// this regex will pick one matching out of two and returns 

$cmd->arguments=stdClass(

    [arg1]=>value, 
    [arg3]=>value 

) 

arg2 et arg4 sont ignorés. Une idée pourquoi? Merci d'avance!

Répondre

1

Pour répondre à votre question: Vous avez un espace \s à la fois au début et à la fin de votre regex, donc après le premier match arg1, la première occurrence de \s- est à arg3 car l'espace que vous recherchez avant arg2 a déjà été trouvé à la fin du premier match.

Il peut également être plus facile de simplement trim() la chaîne, puis split()/explode() aux espaces. Par ailleurs, la suppression de la \s à la fin devrait résoudre votre problème.

+0

cool, logique, j'étais vraiment perdu dans les logiques regex pendant un moment ... Merci! – fabjoa

+0

De rien! – jeroen

0
+0

Cela peut être une bonne alternative, mais pourquoi recommander une autre approche? Tout ce que OP a demandé, c'est pourquoi regex ne fonctionne pas - cela ne veut pas dire que c'est exactement la manière dont il était prévu d'être utilisé. Il peut y avoir d'autres raisons valables pour le faire de cette façon, qui étaient cachées lorsque le scénario de test a été écrit. – MJB

+0

En effet. J'ai supposé seulement son exemple. Ce qui serait très facile à obtenir avec getopt(). – berkes

+0

effectivement je travaille avec un code de quelqu'un d'autre et sa syntaxe est similaire à une syntaxe de shell encore différente à certaines occasions. Merci quand même! – fabjoa

0

Comme jeroen l'a dit, votre problème spécifique est le \s au début et à la fin de votre regex.

Il est facile de réécrire cette expression régulière de sorte que les espaces ne sont pas du tout nécessaires, sauf entre les arg et value. Considérez ceci regex:

-(.*?)\s+([a-zA-Z0-9-_]*) 

Correspondances:

-arg1 value -arg2 value -arg3 value -arg4 value //spaces before and between... 
-arg1 value -arg2 value -arg3 value -arg4 value //no lead spaces...  
Questions connexes