codeigniter 路由参数与正则约束在 ci3 和 ci4 中实现方式不同:ci3 用 $route 数组配合通配符(如 (:num))或原生正则;ci4 用 $routes->get() 等方法,支持占位符和 constraints 数组约束,且顺序、参数获取及后缀处理需特别注意。

CodeIgniter 给路由配置参数和正则约束,核心是靠 通配符 和 原生正则表达式 两种方式实现,但具体写法在 CI3 和 CI4 中差异明显,必须区分版本使用。
CI3:用 $route 数组 + 通配符或正则
所有规则写在 application/config/routes.php,通过 $route['匹配模式'] = '控制器/方法/参数'; 定义。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
内置通配符(最常用):
(:num)→ 只匹配纯数字,如article/123(:any)→ 匹配非斜杠任意字符(等价于[^/]+),如user/john(:alpha)→ 仅字母,(:alphanum)→ 字母+数字 -
正则表达式(更精准):
直接写 PCRE 格式,括号捕获的内容用$1、$2引用。
例如:$route['product/([a-z]+)/(\d+)'] = 'catalog/detail/$1/$2';
访问/product/shoes/99,就会调用Catalog::detail('shoes', '99') -
大小写敏感匹配:
默认路由不区分大小写,如需严格匹配,必须用正则:$route['([A-Z][a-z]+)-(\d+)'] = 'pages/show/$1/$2';
这样MyPost-42能匹配,mypost-42就不会命中
CI4:用 $routes->get() 等方法 + 占位符或正则
规则写在 app/Config/Routes.php,$route 数组已废弃,必须用 $routes 对象的方法注册。
-
占位符语法:
$routes->get('user/(:num)', 'User::view/$1');
支持:num、:any、:segment(同:any)、:alphanum等 -
正则约束(推荐方式):
用数组第三项传正则规则,比直接写正则更安全清晰:$routes->get('post/(:any)', 'Post::show/$1', ['filter' => 'no-cache']);$routes->get('id/(:num)', 'Api::fetch/$1', ['constraints' => ['id' => '\d{4,6}']]);
上面限制id必须是 4–6 位数字 -
自定义正则路径:
直接在 URI 模式里写正则(需转义斜杠):$routes->get('file/([a-zA-Z0-9\-_\.]+)', 'Files::download/$1');
匹配/file/report_v2.pdf这类含点号、下划线的文件名
关键注意事项
无论 CI3 还是 CI4,以下三点直接影响参数能否正确传递:
-
顺序很重要:泛化规则(如
(:any)或.*)必须放在具体规则之后,否则会提前截断匹配 -
参数获取方式不同:CI3 中通常用
$this->uri->segment(3)获取第 3 段;CI4 推荐直接声明方法参数,如public function show(string $slug, int $id),框架自动注入 -
文件后缀要显式处理:比如想支持
/news/123.html,不能靠通配符,得写正则:
CI3:$route['news/(\d+)\.html'] = 'news/show/$1';
CI4:$routes->get('news/(\d+)\.html', 'News::show/$1');










