应使用正则/\{([^}]+)\}/提取openapi路径参数名,其中\{和\}转义花括号,([^}]+)捕获非右括号字符,可正确匹配{id}、{version}等占位符中的变量名。

直接用 preg_match_all() 提取 OpenAPI 路径时,如果路径里含 {id}、{version} 这类占位符,默认正则会把花括号当字面量处理,结果要么匹配失败,要么漏掉参数名 —— 本质是没转义元字符,也没适配 OpenAPI 规范中占位符的语法变体。
OpenAPI 路径占位符的三种常见写法
OpenAPI 3.0+ 中路径参数写法不统一,实际 YAML/JSON 里可能混用:
-
/users/{id}(最常见,花括号包裹) -
/v{version}/items(参数在路径中间,非独立段) -
/api/{tenant}/config/{key}(多参数嵌套)
注意:花括号 { 和 } 是正则元字符,必须转义;而参数名本身(如 id)是变量,需捕获但不能硬编码。
推荐正则模式:/\{([^}]+)\}/
这个模式专为提取占位符内容设计,不是匹配整条路径,而是定位所有参数名:
-
\{和\}:转义花括号,避免被当作正则分组 -
([^}]+):捕获组,匹配任意非}字符至少一次 —— 安全覆盖user_id、tenantName等含下划线或大小写的参数名 - 不加
^和$:避免强制整行匹配,适配路径片段而非完整 URL
示例代码:
$path = '/api/v1/users/{userId}/posts/{postId}';
preg_match_all('/\{([^}]+)\}/', $path, $matches);
// $matches[1] = ['userId', 'postId']
提取完整路径并替换占位符为通配符
如果目标是生成可路由匹配的模式(比如给 Nginx 或 OpenResty 做 location 正则),需把 {xxx} 替换为 ([^/]+) 类型的捕获组:
- 用
preg_replace()替换:preg_replace('/\{([^}]+)\}/', '([^/]+)', $path) - 结果:
/api/v1/users/([^/]+)/posts/([^/]+) - ⚠️ 注意:不要用
.*替代 —— 它会跨段匹配,导致/a/{x}/b/{y}可能吞掉整个路径 - 若需保留参数名用于后续映射(如绑定到
ngx.var.x),建议用命名捕获:'/(?P[^/]+)',但 PHP 的preg_replace()不支持动态命名,得用preg_replace_callback()
容易踩的坑:OpenAPI 的扩展写法和边界情况
某些 OpenAPI 文档会用扩展语法,比如 {id:int} 或 {name:alpha},标准正则 /\{([^}]+)\}/ 仍能提取出 id:int,但你得自己切分冒号后的内容;更麻烦的是:
- 路径含未转义的
{字符(如文档错误写成/log/{message},但message实际是字符串字面量)—— 这种需前置校验是否符合 OpenAPI 参数定义结构 - 参数名含点号或斜杠(极少见,但 OpenAPI 允许):
{user.email}→[^}]+仍能匹配,但后续路由解析可能失败 - 使用
preg_match_all()时忘记传$matches引用参数,导致空数组返回
真正难的不是写正则,而是判断哪个 {xxx} 是规范参数、哪个是文档笔误 —— 这得结合 OpenAPI schema 的 parameters 字段交叉验证,纯正则无法解决。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











