正则表达式从Codeigniter中的url中排除类别。怎么样?

时间:2011-10-12 07:08:33

标签: php codeigniter

我想

这些网址作为我网页上的类别:

http://example.com/en/articles        //for list of all
http://example.com/en/articles/cars    //for list of all cars articles
http://example.com/en/articles/nature  //for list of all nature acrticles
http://example.com/en/articles/sport    //for list of all sport articles

我正在使用i18n,这就是为什么我还有其他链接,如:

http://example.com/fr/articles        //for list of all
http://example.com/fr/articles/cars    //for list of all cars articles
http://example.com/fr/articles/nature  //for list of all nature acrticles
http://example.com/fr/articles/sport    //for list of all sport articles

这很容易,我称之为控制器articles.php anf里面我有功能汽车,自然,运动,一切运作良好。

但是,我想要有文章,无论它们是什么类别,都是这样的:

http://example.com/en/articles/article-about-cars http://example.com/en/articles/article-about-nature

因此,当查看完整文章时,该类别从网址中删除。

我正在使用i18n所以我的路线看起来像这样:

$route[’^en/articles/(.+)$’] = “articles/show_full_article/$1”;
$route[’^fr/articles/(.+)$’] = “articles/show_full_article/$1”;

但每次调用函数show_full_article时都会调用,因为它位于第2段。

所以,我不知何故需要重建正则表达式:

$ route ['^ en / articles /(.+)$'] =“articles / show_full_article / $ 1”;

排除功能汽车,自然和运动。我只有3个类别,因此手动输入并不是什么大不了的事。

如果您知道如何在routes.php中键入正则表达式以排除这三个类别,请让codeigniter再看不到它们作为文章名称,请告诉我。我会非常感激。

提前感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

您可能想要使用negative lookahead (?!...)
 在你的情况下:

 $route['^en/articles/(?!(?:cars|nature|sport)$)(.+)$'] =

这可确保(.+)不能成为其中一个词。它需要包含在(?:..)$中,因此它也匹配字符串的结尾,否则断言也会阻止natureSMTHNG和类似的较长项。