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

如何用正则表达式结合preg_replace删除SQL语句指定查询条件?

用preg_replace清理SQL中的特定AND条件

刚好遇到过类似的需求,我来给你一步步解决这个问题。

你的目标是删掉SQL语句中两类特定的AND条件:AND ( round(data) = 数字 )和AND FIND_IN_SET('数字',data),最终保留select * from table where id=5。我们可以通过正则表达式+PHP的preg_replace来实现,具体步骤如下:

1. 分析要匹配的模式

首先得明确两个需要删除的条件的正则写法(注意转义特殊字符,比如括号、引号,因为它们在正则里有特殊含义):

  • 对于AND ( round(data) = 数字 ):需要匹配AND前后的空格、括号,以及round(data)、等号和任意数字
  • 对于AND FIND_IN_SET('数字',data):需要匹配AND前后的空格、FIND_IN_SET函数的格式,包括引号包裹的数字

2. 编写合并的正则表达式

把两个模式合并成一个正则,用非捕获分组(?:...)和分隔符|来同时匹配两种情况,同时处理AND前后可能存在的任意空格:

$pattern = '/\s*AND\s*\((?:round\(data\)\s*=\s*\d+|FIND_IN_SET\(\'\d+\',data\))\)/';

给你拆解一下这个正则的关键点:

  • \s*:匹配任意数量的空白字符(空格、制表符都算),确保不管AND前后有没有空格都能匹配到
  • \(和\):转义后的括号,用来匹配条件里的字面量括号
  • (?:...):非捕获分组,只是用来把两个子模式打包,不会额外捕获内容
  • |:逻辑“或”,表示匹配分组里的任意一个子模式
  • \d+:匹配一个或多个数字,对应条件里的数值部分

3. 执行替换的代码示例

把你的原SQL和正则结合,用preg_replace完成替换:

// 原SQL语句
$data = "select * from table where id=5 AND ( round(data) = 2 ) AND ( round(data) = 5 ) AND FIND_IN_SET('159',data)";

// 正则匹配模式
$pattern = '/\s*AND\s*\((?:round\(data\)\s*=\s*\d+|FIND_IN_SET\(\'\d+\',data\))\)/';

// 执行替换
$cleanedSql = preg_replace($pattern, '', $data);

// 输出结果:select * from table where id=5
echo $cleanedSql;

运行这段代码后,就能得到你想要的干净SQL语句啦。如果后续还有类似格式的条件需要删除,只需要在正则的分组里添加对应的子模式就行。

内容的提问来源于stack exchange,提问作者Kenan Şimşek Birusk Kuresofa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:03:13