我正在一个小型 MVC 框架中构建一个路由器对象。它解析 url 字符串以发现控制器、操作等。它是可配置的。
目前,用户可以通过传入如下字符串来创建路由:
$this->connect('/:controller/:action/*');
$this->connect('/:controller', array('action' => 'index'));
$this->connect('/', array('controller' => 'static_pages', 'action' => 'index'));
并且路由器从这些中构建以下正则表达式:
#^(.*)/(.*)/?.*/?$#
#^(.*)/?$#
#^/$#
最后,路由器尝试根据 url 选择正确的路由。上述路由的 url 看起来像这样:
/cars/get_colors/ # will invoke cars->get_colors();
/cars/ # will invoke cars->index();
/ # will invoke static_pages->index();
然而
我的正则表达式不正确。第一个(更具体的)表达式可以匹配第二个条件,第二个可以匹配第一个。
如果我翻转顺序以反向检查,静态页面路由有效,然后控制器索引路由有效,但控制器索引路由捕获所有更具体的路由!
更新
我正在使用正则表达式,因为用户还可以像这样连接路由:
$this->connect('/car/:action/*', array('controller' => 'cars');
$this->connect('/crazy/url/:controller/:action/*');
这将构建两个类似于此的正则表达式:
#^car/(.*)/?.*/?$#
#^crazy/url/(.*)/(.*)/?.*?$#
最后,做以下路由:
/car/get_colors/ # will invoke cars->get_colors();
/crazy/url/cars/get_colors/ # will invoke cars->get_colors();