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

如何用正则匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:25:17