You need to enable JavaScript to run this app. PHP正则解析类文档@mapping注解多参数生成关联数组的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 17:36:04