我正在一个小型MVC框架中构建路由器对象。它解析url字符串以发现控制器,操作等。它是可配置的。
目前,用户可以通过传入如下字符串来创建路由:
$this->connect('/:controller/:action/*');
$this->connect('/:controller', array('action' => 'index'));
$this->connect('/', array('controller' => 'static_pages', 'action' => 'index'));
路由器从那些构建以下正则表达式:
#^(.*)/(.*)/?.*/?$#
#^(.*)/?$#
#^/$#
最后,路由器尝试根据网址选择正确的路由。上述路线的网址如下所示:
/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();
答案 0 :(得分:2)
首先,您可以使用explode函数将URL拆分为slug,而不是使用正则表达式,从而让您的生活更轻松。
但是,如果必须使用正则表达式,请将“。*”更改为“[^ /] +”
请记住,点匹配所有内容,包括斜杠。表达式“[^ /]”匹配除斜线之外的所有内容。
此外,如果字符串以斜线开头,则需要使用斜杠开始正则表达式。
最后,您需要使用“+”量词而不是“*”量词。
请考虑以下示例,这些示例与帖子中的正则表达式相对应:
#^/[^/]+/[^/]+(/.*)?$#
#^/[^/]+/?$#
#^/$#
#^/car/[^/]+(/.*)?$#
#^/crazy/url/[^/]+/[^/]+(/.*)?$#
答案 1 :(得分:1)
我使用了preg_replace函数来执行此操作。
preg_replace($ pattern,$ replacement,$ string)
preg_replace函数执行正则表达式搜索和替换。这将搜索主题匹配模式并用替换替换它们。
e.g。 http://example.com/my-planet-earth/
我在谈论格式化'my-planet-earth'。在这里,$ string可以是'My Planet Earth',$ urlKey将是'my-planet-earth'$ string =“planet + *& john doe / / \ \ ^ 44 5%6 + - @ ku!~`这个”; $ urlKey = preg_replace(array('/ [^ a-z0-9 - ] / i','/ [] {2,} /','/ [] /'),array('','',' - '),$ string); //输出:planet-john-doe-44-5-6 --- ku-this
希望这有帮助。