嘿伙计们,关于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。知道为什么吗?提前谢谢!
答案 0 :(得分:1)
要回答您的问题:您在正则表达式的开头和结尾都有\s
空格,因此在第一次匹配arg1
之后,第一次出现\s-
是在arg3
,因为您在arg2
之前搜索的空间已在第一场比赛结束时进行了匹配。
也可能更容易trim()
字符串,然后在空格处split()
/ explode()
。
修改:顺便说一下,删除最后的\s
可以解决您的问题。
答案 1 :(得分:0)
答案 2 :(得分:0)
正如jeroen所说,您的具体问题是正则表达式开头和结尾的\s
。
重写此正则表达式很容易,因此除了arg
和value
之外,根本不需要空格。考虑一下这个正则表达式:
-(.*?)\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...