代码点火器与我的[a-z]路线不匹配

时间:2013-04-14 09:27:11

标签: php codeigniter

我有这个显示产品列表的网址,由名为category_listing的控制器管理:

http://localhost:8888/shop/mens/trainers/

我使用uri段4为此页面添加了分页,因此url最终看起来像这样:

http://localhost:8888/shop/mens/trainers/2

我还希望有一条允许用户通过访问此网址查看产品的路线:

http://localhost:8888/shop/mens/trainers/a-trainer-product-here

这由名为product_listing的控制器管理。

所以我创建了一条路线:

$route['shop/(:any)/(:any)/[a-z]'] = 'product/product_listing/$1/$2/$3';

我希望能让我匹配所有产品网址,同时忽略其中包含分页索引的网址。不幸的是它似乎没有用。当我在网址中访问带有产品的链接时,页面(应该使用product_listing控制器)仍在尝试调用category_listing控制器。

有什么想法吗?我想知道网址的产品名称部分中的连字符(a-trainer-product-here)是否会导致匹配的[a-z]部分出现问题?

2 个答案:

答案 0 :(得分:2)

您正在使用的正则表达式只能匹配从a到z的字母,并且它只匹配一次,它将不匹配“ - ” 所以代替:

 $route['shop/(:any)/(:any)/[a-z]'] 
你可以尝试:

 $route['shop/(:any)/(:any)/([a-z-]*)'] 

希望这会有所帮助。

答案 1 :(得分:1)

[a-z]只匹配一个字符。您可能希望为一个或多个或+添加一个修饰符,如*为零或更多。你的模式也表明你想要捕获最后一个片段(你的替换中有$3),你的示例slug中有-个,所以普通[a-z]只匹配在它前面的“a”。

结合所有这些,我想你会想写:

$route['shop/(:any)/(:any)/([-a-z]*)'] = 'product/product_listing/$1/$2/$3';

这将匹配零个或多个长度slug,在$3中捕获它们并允许- s。 我还会考虑在那里使用第三个(:any),具体取决于你如何创建这些slu ..