如何在PhpStorm中用正则匹配switch结构内的continue;语句
PHP7.3升级兼容排查:匹配switch块内continue;的PhpStorm正则方案
问题背景
PHP 7.3版本对switch结构内的continue用法做了不兼容变更:
版本升级前,switch结构内直接书写
continue;会被当作break;执行,仅跳出switch结构本身;7.3版本开始该写法会触发E_WARNING警告,若未明确指定continue的层级,后续PHP版本可能将该场景升级为致命错误。
原有正则switch.*\s.*\s.*continue;仅能匹配switch语句与continue间隔2行以内的场景,当两者跨行、间隔多行时会匹配失效,原因是默认正则规则中.不会匹配换行符,且PhpStorm全局搜索不支持手动添加multiline多行匹配标记。
可用正则
直接将以下正则复制到PhpStorm全局搜索框,勾选搜索栏的「Regex」选项即可使用:
switch\s*\([^)]+\)\s*\{[\s\S]*?continue;
正则规则说明
switch\s*\([^)]+\)\s*\{:匹配switch语句起始部分,兼容括号前后、开括号前存在任意数量空格、换行的写法,精准定位到switch代码块的开括号位置[\s\S]*?:匹配任意数量的所有字符(包含换行、缩进、代码逻辑内容),该写法不需要依赖多行匹配开关,完美适配PhpStorm全局搜索的正则规则;采用非贪婪匹配模式,不会跨多个switch代码块造成误匹配continue;:精准定位目标语句
排查注意事项
- 不要勾选搜索栏的「Words」全字匹配选项,否则会因分号、缩进空格的存在导致匹配失效
- 上述正则会匹配switch开括号后所有出现的
continue;,如果switch内部嵌套了for/while/foreach等循环结构,循环内部的continue也会被命中,这部分需要人工二次校验:只有直接归属switch分支、不属于switch内部嵌套循环的continue;才是需要修复的兼容点 - 若需要初步过滤嵌套循环内的continue,可使用进阶正则减少人工校验成本:
switch\s*\([^)]+\)\s*\{(?:(?!for\s*\(|while\s*\(|foreach\s*\()[^}])*?continue;
内容的提问来源于stack exchange,提问作者Frank Groot
相关产品推荐
相关产品推荐

