codeigniter 3 路由支持原生 pcre 正则,需将正则写在路由键中并用 $1、$2 引用捕获组;区分大小写由正则决定,特殊字符需转义,多段路径用 .* 或 1+ 组合,且须注意匹配顺序与锚点禁用。/ ↩

CodeIgniter 3 的路由支持原生 PCRE 正则语法,用正则约束参数比通配符(如 (:num)、(:any))更精准、更可控。关键在于:把正则写在路由键(左侧)中,用括号捕获需要的片段,再通过 $1、$2 等引用到右侧控制器路径里。
正则参数的基本写法
CI3 路由中的正则不是 PHP preg_match 直接调用,而是由框架内部解析匹配。只要符合 PCRE 规则,就能生效:
-
$route['article/([a-z0-9\-]+)'] = 'blog/show/$1';→ 只匹配小写字母、数字和短横线,如/article/my-post-2023,拒绝/article/MyPost或/article/post/1 -
$route['user/([A-Z][a-z]+)'] = 'profile/get_by_name/$1';→ 要求首字母大写、后续小写,如/user/John,不匹配/user/john或/user/J0HN -
$route['api/v(\d+)/products/(\d+)'] = 'api/products/detail/$1/$2';→ 同时捕获版本号和产品 ID,$1是版本(如2),$2是 ID(如105)
区分大小写与特殊字符处理
默认情况下,CI3 路由就是区分大小写的——正则本身决定是否允许大写,不需要额外开关:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 用
[a-zA-Z]显式允许大小写混合 - 用
[a-z]限制仅小写;[A-Z]限制仅大写 - URL 中的点(
.)、加号(+)、问号(?)等需转义,例如匹配邮箱前缀:'user/([a-zA-Z0-9\.\_]+)@example\.com' - 斜杠
/在路由键中是路径分隔符,不能直接出现在正则片段里;如需匹配多段,应改用.*或组合通配符(见下一条)
匹配多段路径或剩余部分
当 URL 段数不确定(比如支持 /a/b/c、/a/b/c/d/e),单靠 (:any) 不够用,要用正则 .* 或 [^/]+ 组合:
-
$route['pages/([^/]+)/([^/]+)/(.*)'] = 'pages/view/$1/$2';→ 前两段必须存在且不含斜杠,第三段起全部忽略(.*匹配包括斜杠在内的任意内容) -
$route['archive/(\d{4})/(\d{2})/(\d{2})'] = 'blog/archive/$1/$2/$3';→ 严格要求年月日为 4-2-2 数字格式,如/archive/2026/10/22 - 注意顺序:更具体的正则规则要放在更宽泛的之前,否则
.*类规则可能提前截断匹配
避免常见陷阱
写正则路由时容易忽略几个底层细节:
-
(:any)实际等价于([^/]+),它**不匹配斜杠**;而.*才能匹配含斜杠的整个后续路径 - 正则中不要写
^或$锚点——CI 路由自动做前缀匹配,加锚点反而导致失败 - 如果右侧控制器方法需要多个参数,确保左侧正则的捕获组数量与
$1、$2…一一对应,缺一不可 - 调试时可在控制器中用
$this->uri->segment(n)验证实际收到的参数,确认是否被正确截取










