如何用正则匹配PHP中重复表达式的三元运算符简化场景?
直接用反向引用就能解决捕获组内容一致的问题,正则表达式和替换规则如下:
匹配正则
(\$[^?\s]+)\s*\?\s*\1\s*:
替换规则
$1 ?:
关键说明
(\$[^?\s]+):捕获第一个以$开头、不含问号和空白的表达式(对应你的$expression),存入捕获组1\s*\?\s*:匹配问号前后的任意空白(兼容不同格式的空格/制表符)\1:反向引用捕获组1的内容,强制要求第二个表达式和第一个完全一致,这就是解决你问题的核心\s*::匹配冒号前的任意空白
示例验证
原代码:
$result = $this->system->cache('1234') ? $this->system->cache('1234') : $fallback;
替换后:
$result = $this->system->cache('1234') ?: $fallback;
补充提示
如果你的表达式里偶尔包含空白(你提到少数情况手动排查),可以适当调整正则的字符范围,但根据你描述的「通常不含空格」的场景,上面的正则已经能覆盖绝大多数情况。
内容的提问来源于stack exchange,提问作者Yimin Rong
相关产品推荐
相关产品推荐

