2011-08-09 37 views
0

我刚刚完成学习正则表达式,我想我应该把它变成有用的东西,所以我创建了PHP的小URL路由脚本和下面的正则表达式:困惑正则表达式中的URL路由脚本行为

^(?:/(\w+)?)*$ 

(php代码目前不做任何事情,只是打印出preg_match中的匹配组) 当前如果给定url /foobar/foo/bar,匹配组是整个字符串(正常行为)和url的最后部分这种情况下:bar)。
显然,这是一个问题。

我认为这是由于使用1个捕获组而导致的,它只捕获最后一个匹配的字符串,但我不确定。任何意见,真正的原因和/或解决方案,将不胜感激。

在此先感谢!

+0

再来,究竟是什么问题呢?你想要捕捉什么?你的正则表达式看起来相当危险,嵌套的“是,但是,不,但”重复操作符(它是Vicky Pollard正则表达式!),但没有关于你想匹配什么的更多信息,也不清楚如何改进它。 – tripleee

+0

@tripleee我希望每个组都会被记住,并且不会在每场比赛中被覆盖(但根据Tim的回答,这是不可能的)。正则表达式非常“危险”,因为我希望能够在没有对代码进行任何检查的情况下向他抛出一个URL,所以我让正则表达式执行代码将做的事情(剥离斜线,匹配空路径等)。 )。 – GZaidman

回答

1

您已经正确诊断问题 - 在周围群组的每次重复中,捕获组的先前匹配的内容都被新匹配“覆盖”。

目前尚不十分清楚你会发生什么。我想你会希望将这条道路的每一部分都作为自己的群体“记住”?这是你不能用PHP中的重复组做的事情(只有少数正则表达式(Perl 6和.NET)允许这样的事情)。

在你的情况,你可能使用您正则表达式验证URL更好,然后沿斜线分割它:

$result = preg_split('%/%', $subject); 
+0

是的,那正是我认为会发生的事情(也许是时候切换回perl?:P)。关于你的建议,从性能的角度来看,使用'explode'而不是'preg_split'会更好吗? – GZaidman

+0

我很确定它会是(因为你正在分裂一个固定的字符)。 –

+0

事实证明有一种方法可以在php中实现 - 我修改了正则表达式,因此它不包含'*',并使用了'preg_match_all',它给了我所有的部分。 – GZaidman