PHP正则解析类文档@mapping注解多参数生成关联数组的实现方法
实现可行性结论
完全可以通过PHP正则结合基础字符串处理逻辑,从类文档注释中精准提取@mapping注解的参数,生成要求的关联数组,同时兼容多组逗号分隔的参数解析场景。
现有解析代码的局限性
目前使用的正则/@([a-z]+?)\s+(.*?)\n/i仅能匹配注解后跟随的普通文本,无法识别@mapping后带括号的嵌套参数结构,会把整个括号内的内容作为单个字符串存储,无法拆分出独立的键值对。
可直接落地的实现代码
function parseMappingAnnotation(string $docComment): array { // 匹配@mapping注解包裹的参数内容,支持跨多行的注解书写 if (!preg_match('/@mapping\s*\((.*?)\)/is', $docComment, $mappingBlock)) { return []; } $rawParamStr = trim($mappingBlock[1]); if (empty($rawParamStr)) { return []; } $mapping = []; // 拆分所有键值对,兼容单/双引号包裹的值、无引号的裸值 preg_match_all( '/(\w+)\s*=\s*([\'"]?.*?[\'"]?)(?:,|$)/', $rawParamStr, $paramList, PREG_SET_ORDER ); foreach ($paramList as $param) { $key = trim($param[1]); // 去掉值首尾包裹的引号 $value = trim(trim($param[2]), '\'"'); $mapping[$key] = $value; } return $mapping; }
实际运行效果
使用你提供的示例文档注释测试:
// 模拟反射拿到的类文档注释 $reflectionDoc = <<<DOC /** * @mapping(table='example') */ DOC; print_r(parseMappingAnnotation($reflectionDoc));
输出结构和预期完全一致:
Array ( [table] => example )
针对多参数场景的测试,比如注解为@mapping(table='example', primaryKey=id, comment="示例关联表"),最终输出的数组为:
Array ( [table] => example [primaryKey] => id [comment] => 示例关联表 )
关键逻辑说明
- 匹配注解块的正则增加了
/i(不区分大小写)、/s(让.匹配换行符)修饰符,支持跨多行书写的复杂注解 - 参数提取时自动剥离值首尾的单/双引号,保证数组存储的是实际值,不保留格式符号
- 键值对拆分逻辑会跳过值内部的普通逗号,避免因为值内容含逗号导致解析截断
- 全流程依赖PHP内置函数,无第三方扩展依赖
内容的提问来源于stack exchange,提问作者Jason Derrick
相关产品推荐
相关产品推荐

