gpt4 book ai didi

php - 如何在 PHP 中使用正则表达式中断查询

转载 作者:搜寻专家 更新时间:2023-10-31 21:18:04 24 4
gpt4 key购买 nike

假设我有以下字符串:

insert into table values ('text1;'); insert into table values ('text2')

如何使用正则表达式打破这些查询(获取每个单独的查询)?

我发现了一个非常相似的问题:Use regex to find specific string not in html tag ...但它使用特定于 .NET 的解决方案:在查找后面(在 php 中它提示不是固定长度)。

如果有人能给我一些关于如何处理这个问题的提示,我将不胜感激。

最佳答案

诀窍是计算您通过了多少个未转义的引号字符。假设 SQL 在语法上是正确的,偶数个未转义引号字符后的分号将是您想要的,奇数个未转义引号字符后的分号将是字符串文字的一部分。 (请记住,字符串文字可以包含正确转义的引号字符。)

如果你想要 100% 的可靠性,你需要一个真正的 SQL 解析器,比如 this . (我刚刚用 Google 搜索了“PHP 中的 SQL 解析器”。我不知道它是否有效。)


编辑:

我认为只使用正则表达式不可能找到成对的未转义引号字符。也许正则表达式大师会证明我错了,但在这么多可能的组合中区分转义和未转义的引号字符似乎太难了。我尝试了后视断言和反向引用,但没有成功。

以下不是纯正则表达式的解决方案,但我认为它可行:

preg_match_all("/(?:([^']*'){2})*[^']*;/U", str_replace("\\'", "\0\1\2", $input), $matches);
$output = array_map(function($str){ return str_replace("\0\1\2", "\\'", $str); }, $matches[0]);

基本上,我们暂时将转义引号字符替换为极不可能出现的字节串,在本例中为\0\1\2。之后,所有剩下的引号字符都是未转义的。正则表达式挑选出前面有偶数个引号字符的分号。然后我们恢复转义引号字符。 (我在那里使用了一个闭包,所以它只是 PHP 5.3。)

如果您不需要处理字符串文字中的引号字符,是的,您可以使用纯正则表达式轻松完成。

关于php - 如何在 PHP 中使用正则表达式中断查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4001797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com