2013-02-28 78 views
1

我正在将旧网站转换为CodeIgniter,其中涉及保留一些旧的URL。我需要能够传递单个字符,无论是#,A-Z还是a-z。这是我的模式:在CodeIgniter路由中使用RegEx

/^[a-zA-Z#]$/ 

它通过传递给preg_match()似乎在我所有的测试中工作得很好。我只是把它添加到这样的CI路线:

$route['(:any)/(/^[a-zA-Z#]$/)'] = "collection/view/$1/alpha/$2"; 

,它是给我这个错误:

Message: preg_match(): Unknown modifier '/' 

我不能为我的生命按摩这种模式,让CI接受它。我认为它被奇怪地逃脱了。任何帮助,将不胜感激。

UPDATE:

我一头到/core/Router.php只是为了看看CI与模式做。以下是CI正在使用的内容:

#^(.+)/(/^[a-zA-Z\#]$/)$# 

它将整个传递的字符串转换为一个大型模式。

解决:

搞清楚的是CI试图创建一个大的格局后,我改写了从无到有的模式和删除(:任何)。我也用#代替了#。这是我的最终解决方案:

$route['(^(.+)/([a-zA-Z\+]$))'] = "collection/view/$2/alpha/$3"; 

如果任何人有一个更优雅的模式,请随时张贴它。谢谢!

+0

'#'是一个URL特殊字符,我不认为你可以用它的路线,因为服务器不能读它,或任何后面的东西。 – 2013-02-28 05:41:50

+0

我认为我也是这样删除了#并试图用a-zA-Z进行测试,但仍未找到匹配结果。 – madzilla 2013-02-28 14:30:59

回答

2
$route['(:any)/(^([a-zA-Z]|\#))'] = "collection/view/$1/alpha/$2"; 
+0

照顾了错误,但我没有得到匹配: http://example.com/test/a – madzilla 2013-02-28 05:18:23

+0

仍然没有匹配。我需要这个^不管我想确保只有一个字符被传递。我还删除了所有其他路线,以查看是否有冲突并且没有去。此时相当迷茫。 – madzilla 2013-02-28 05:32:22

+0

@madzilla,我认为打开'/'和关闭'/'会被CI自动添加。试试这一次。 – 2013-02-28 05:52:01

0

我不认为你需要逃避#在正则表达式。尝试使用

/^([a-zA-Z#])$/

,而不是

(/^([a-zA-Z]|#)$/)

+0

如果我没有逃脱,我得到上面的错误。但我可以缩短你所建议的模式。我甚至可以删除()。 – madzilla 2013-02-28 05:41:31

+0

也许试图把斜倚在斜线里面来捕获$ 2?编辑答案反映了这一点。 – irregularexpressions 2013-02-28 06:44:39