如何简化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
相关产品推荐
相关产品推荐

