如何用正则匹配PHP中statement()函数内的所有内容?
提取DB::statement内查询语句的正则方案
要精准捕获DB::statement()函数内的SQL内容,用以下正则表达式即可解决你的问题:
核心正则
DB::statement\(\s*'([\s\S]*?)'\s*\)
正则细节解释
DB::statement\(:严格匹配目标函数的开头,转义括号避免被正则引擎当作语法符号\s*:匹配括号内前后可能存在的任意空白(包括换行、空格、制表符),兼容代码格式化后的排版'([\s\S]*?)':':锁定SQL字符串的单引号边界[\s\S]*?:非贪婪模式匹配所有字符(包括换行,完美适配多行SQL),括号内的内容就是要提取的SQL
\s*\):匹配函数结尾的空白和闭合括号
PHP实际使用示例
// 反射得到的内容示例 $content = ' DB::statement(\' ALTER TABLE `activity` ADD `deleted_at` TIMESTAMP NULL \'); DB::statement(\' ALTER TABLE `activity_recurrence` ADD `deleted_at` TIMESTAMP NULL \');'; // 应用正则提取 preg_match_all('/DB::statement\(\s*\'([\s\S]*?)\'\s*\)/', $content, $results); // 处理并输出结果 foreach ($results[1] as $sql) { // 去除前后多余空白 echo trim($sql) . "\n\n"; }
运行后输出的结果:
ALTER TABLE `activity` ADD `deleted_at` TIMESTAMP NULL ALTER TABLE `activity_recurrence` ADD `deleted_at` TIMESTAMP NULL
特殊场景兼容
如果你的SQL语句中存在转义的单引号(比如\'),需要把正则调整为:
DB::statement\(\s*'((?:[^'\\]|\\.)*?)'\s*\)
这个版本可以正确识别转义的单引号,避免提前终止匹配。
内容的提问来源于stack exchange,提问作者Remy
相关产品推荐
相关产品推荐

