需要帮助修改这些简单的正则表达式以匹配网址

时间:2011-01-19 04:17:52

标签: php regex frameworks url-routing router

我正在一个小型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();

2 个答案:

答案 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

希望这有帮助。