正则表达式在匹配模式中打印出两个中的一个

时间:2010-07-09 13:24:56

标签: php regex

嘿伙计们,关于PHP中正则表达式的问题!

对于给定的模式,有点像shell终端语法:

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

我想解析这些论点。这是我的正则表达式代码

$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和arg4。知道为什么吗?提前谢谢!

3 个答案:

答案 0 :(得分:1)

要回答您的问题:您在正则表达式的开头和结尾都有\s空格,因此在第一次匹配arg1之后,第一次出现\s-是在arg3,因为您在arg2之前搜索的空间已在第一场比赛结束时进行了匹配。

也可能更容易trim()字符串,然后在空格处split() / explode()

修改:顺便说一下,删除最后的\s可以解决您的问题。

答案 1 :(得分:0)

答案 2 :(得分:0)

正如jeroen所说,您的具体问题是正则表达式开头和结尾的\s

重写此正则表达式很容易,因此除了argvalue之外,根本不需要空格。考虑一下这个正则表达式:

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

匹配

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