对url路由脚本中正则表达式的行为感到困惑



我刚刚完成了关于正则表达式的学习,我认为我应该把它变成一些有用的东西,所以我用php和以下正则表达式创建了一个小的url路由脚本:

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

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

我认为这是由于使用1捕获组引起的,它只捕获最后匹配的字符串,但我不确定。任何关于这一问题的真正原因和/或解决方案的建议都将不胜感激。

提前感谢!

您已经正确地诊断了问题-在每次重复周围组时,捕获组先前匹配的内容被新的匹配"覆盖"。

不太清楚你会期望发生什么。我猜你会希望这条路的每一部分都被"记住"为自己的一组?这在PHP中是无法使用重复组的(只有少数正则表达式方言(Perl 6和。net)允许这样做)。

在您的情况下,您可能最好使用您的正则表达式来验证URL,然后沿着斜杠分割它:

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

最新更新