将Codeigniter路由与正则表达式相结合

时间:2010-03-06 12:45:34

标签: regex codeigniter routing routes

我一直在玩Codeigniter创建一个电子商务网站,我正在努力做到以下几点:

将类别名称作为第一个参数,例如

  • /tshirts
  • /shoes

以下每一项都是过滤器(在类别上)或产品(在SEO的URL中有类别)

  • /tshirts/filter/price/0-20
  • /tshirts/pink-with-blue-spots

我目前在路由中做的是:

$route['tshirts']                    = 'category/index';
$route['tshirts/(filter|sort)']      = 'category/index';
$route['tshirts/(filter|sort)/:any'] = 'category/index/filter';
$route['tshirts/:any']               = 'product/index';

我想将前两行合并为一条,因为它们正在访问相同的控制器和方法。

第二行是有人在/filter/之后移除部分,并且可能与另一条路线合并。

最后一个路由表示第二个参数是产品名称,因此必须传递给产品控制器。

我一直在玩http://gskinner.com/RegExr/并提出以下内容,这可能很接近,我想我只需要将括号中的部分作为选项(它正在拾取正确的路线,除了没有任何路线的路线)第二个参数),但我不知道如何。

category/?(filter|sort|page)

谢谢!

2 个答案:

答案 0 :(得分:5)

今天快速浏览一下,现在已经结合了

$route['tshirts/(filter|sort)']      = 'category/index';
$route['tshirts/(filter|sort)/:any'] = 'category/index/filter';

$route['tshirts(/(filter|sort|page)(/(:any))?)?'] = "category/index/$4";

在类别控制器的index($filter = null)方法中,使用$filter != null查看是否需要应用过滤规则。

答案 1 :(得分:3)

我不熟悉CodeIgniter路由的语法。但试试这个:

$route['tshirts(/(filter|sort))?']      = 'category/index';

如果支持非捕获组:

$route['tshirts(?:/(filter|sort))?']      = 'category/index';