如何用正则表达式结合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
相关产品推荐
相关产品推荐

