2013-02-28 51 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