You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化PHP匹配{deck:xxx}后可变数量括号组语法的冗余代码?

简化方案

你可以通过单个兼容1-4个括号组的正则或者两步拆分匹配的方式完全去掉冗余的if-else分支,所有逻辑统一写在一处即可。

方案1:单正则一次性匹配(性能更高,适合固定最多4个括号的场景)

直接把4个括号组都设为可选匹配,匹配后过滤空值即可自动适配1-4个括号的情况:

// 匹配规则:deck名称 + 最多4个可选括号组
$pattern = '/\{deck:([^}]+)\}(?:\(([^)]+)\))?(?:\(([^)]+)\))?(?:\(([^)]+)\))?(?:\(([^)]+)\))?/';

if (preg_match($pattern, $待匹配字符串, $matches)) {
    $deck名称 = $matches[1];
    // 提取括号内容,自动过滤不存在的空项
    $卡组分组 = array_filter(array_slice($matches, 2), fn($item) => $item !== '');
    
    // 这里直接写统一的业务逻辑即可,不需要再分分支处理
}

方案2:两步拆分匹配(扩展性更强,适合后续可能调整括号数量的场景)

先匹配deck名称前缀,再单独提取所有括号内容,只需要加个简单的数量校验即可:

// 第一步:匹配deck名称前缀
if (preg_match('/^\{deck:([^}]+)\}/', $待匹配字符串, $nameMatch)) {
    $deck名称 = $nameMatch[1];
    // 第二步:提取前缀后的所有括号内容
    preg_match_all('/\(([^)]+)\)/', substr($待匹配字符串, strlen($nameMatch[0])), $groupMatches);
    $卡组分组 = $groupMatches[1];
    
    // 校验括号数量符合1-4的要求
    if (count($卡组分组) >= 1 && count($卡组分组) <=4) {
        // 这里直接写统一的业务逻辑即可
    }
}

两种方案都完全不需要多层if-else判断不同括号数量的情况,代码冗余度直接降到最低。

内容的提问来源于stack exchange,提问作者Tanker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:36:04