用于codeigniter的regexp子组匹配

时间:2012-10-17 16:35:15

标签: regex codeigniter-2

我正在使用代码点火器,并试图通过$ routes数组捕获多个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';

显然相当冗长。 最终,我想在一个正则表达式中捕获所有段。

想法?

1 个答案:

答案 0 :(得分:0)

在一个正则表达式中通常不可能有任意多个捕获组。从您自己的尝试中可以看出,如果您重复一个捕获组,您将获得最后一个匹配。但是,您可以通过使其他“目录”可选来解决一定数量的路径元素。说3是你的最大值:

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

您可以在末尾添加一些嵌套的(/[\w-?]+)?以允许更深的路径。否则,您可以使用循环自动填充$route数组,但这也仅适用于固定深度。