preg_match - regex - 区分命名子模式和以相同字符串开头的模式

时间:2011-12-30 03:37:16

标签: php regex routes preg-match

我正在为轻量级MVC框架创建自己的url路由器类。我正在实现一个简单的基于数组的系统,并通过一系列循环确定参数的位置等等。我已经阅读了django书,并且喜欢他们只是匹配模式的系统,并调用类和方法,如果模式匹配。我有它运作良好,但我坚持绘制两种不同的模式,并且我承认我不是正则表达式中最好的。

所以我有一个url模式数组和相应的类/方法:

'/^\/users\/(?P<username>\w+)$/' => array('class' => 'userController', 'method' => 'detailUserAction'),

'/^\/users\/update$/' => array('class' => 'userController', 'method' => 'updateUserAction'), 

并且第一个模式总是匹配在以/ users开头的任何其他模式之前,并且之后还有其他内容。

稍后在代码中我循环遍历数组并执行此代码:

if (preg_match($urlPattern, $pathString, $matches)){
                $this->invokeObject($command, $matches);
                exit;
            }

关于我可以用什么模式来区分这两个网址的任何想法?

一个是/ users / username

,另一个是/ users / update

我想我总是可以在数组的顺序中首先包含其他的,这是我最好的选择吗?

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下应该优化URI设计。如果用户被称为“更新”,“添加”或“删除”,该怎么办?它会在您的用户名模式中添加特殊情况,并且将来不易维护/扩展。

但是如果意味着用户id,我认为您可以将子模式更改为(?P \ d +),这可以消除歧义。