2012-10-17 53 views
1

我正在使用代碼點火器,並試圖通過$ routes數組捕獲多個url段。regexp codeigniter的子組匹配

例如,我的URL看起來像這樣:

/segment-1/segment-2/keyword/ 

我一直在試圖用眼前這個正則表達式:

$route['([\w-?]+){1,3}'] = "my/method"; 

但只返回這個小組的比賽:

segment-1 

然後當我嘗試這條路線:

(\/[\w-?]+){1,3} 

它返回的分組比賽:

/keyword 

所以我一直明確地把我要確保我捕捉到所有的情況下,精確的路線:

$route['([\w-?]+)'] = 'my/method/$1'; 
$route['([\w-?]+)/([\w-?]+)'] = 'my/method/$1/$2'; 
$route['([\w-?]+)/([\w-?]+)/([\w-?]+)'] = 'my/method/$1/$2/$3'; 

這顯然是相當詳細。最終,我想在一個正則表達式中捕獲所有的段。

想法?

回答

0

通常不可能在一個正則表達式中擁有任意多個捕獲組。正如你可以從你自己的嘗試中看到的那樣,如果你重複一個捕獲組,你只會得到最後一場比賽。但是,通過增加可選的「目錄」,您可以將其解決到一定數量的路徑元素。假設3是你最大:

$route['([\w-?]+)(/[\w-?]+(/[\w-?]+)?)?'] = 'my/method/$1$2$3'; 

你可以在最後幾個嵌套(/[\w-?]+)?添加到允許更深的路徑。否則,您可以使用循環自動填充$route陣列,但這也只能用於固定深度。

+0

雖然這不是確切的答案,但它非常接近,所以我會無論如何給你=)。這裏是我最後寫的,以使我的路線正確匹配:'$ route ['somekey(/([\ w - ?] +))?(/([\ w - ?] +))?(/( [\ w - ?] +))?'] ='我的/方法/ $ 2/$ 4/$ 6';'。我使用了'$ 2','$ 4','$ 6' b/c我已經做了子組匹配來忽略我的初始匹配上的'/'字符,並最終使所有的段都是可選的。 – hellatan