1

我正在研究一种基于 SQL 查询获取所有值的方法,然后在 php 中对它们进行转义。

这个想法是让那些在执行 SQL 查询时不关心安全性的程序员。

因此,当我尝试执行此操作时:

INSERT INTO tabla (a, b,c,d) VALUES ('a','b','c',a,b)

正则表达式需要捕获'a' 'b' 'c' ab

我为此工作了几天。

到目前为止,我可以使用 2 个正则表达式查询,但我想知道是否有更好的方法:

VALUES ?\((([\w'"]+).+?)\)

根据前面的 SQL,这将匹配:

VALUES ('a','b','c',a,b)

第二个正则表达式

['"]?(\w)['"]?

将匹配

a b c a b

以前删除VALUES,当然。

这种方式将匹配很多我要插入的值。

但例如不适用于 JSON。

{a:b, "asd":"ads" ....}

有什么帮助吗?

4

1 回答 1

0

首先,我想你应该知道 SQL 支持多种类型的单/双引号字符串:
'Northwind\'s category name'
'Northwind''s category name'
"Northwind \"category\" name"
"Northwind ""category"" name"
"Northwind category's name"
'Northwind "category" name'
'Northwind \\ category name'
'Northwind \ncategory \nname'

要匹配它们,请尝试以下模式:
"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"
'[^\\']*(?:(?:\\.|'')[^\\']*)*'

将模式组合在一起:

VALUES\s*\(\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|'[^\\']*(?:(?:\\.|'')[^\\']*)*'|\w+)(?:\s*,\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|'[^\\']*(?:(?:\\.|'')[^\\']*)*'|\w+))*\)

PHP5.4.5示例代码:

    <?php
$pat = '/\bVALUES\s*\((\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|\'[^\\\']*(?:(?:\\.|\'\')[^\\\']*)*\'|\w+)(?:\s*,\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|\'[^\\\']*(?:(?:\\.|\'\')[^\\\']*)*\'|\w+))*)\)/';
$sql_sample1 = "INSERT INTO tabla (a, b,c,d) VALUES ('a','b','c',a,b)";
if( preg_match($pat, $sql_sample1, $matches) > 0){
    printf("%s\n", $matches[0]);
    printf("%s\n\n", $matches[1]);    
}

$sql_sample2 = 'INSERT INTO tabla (a, b,c,d) VALUES (\'a\',\'{a:b, "asd":"ads"}\',\'c\',a,b)';
if( preg_match($pat, $sql_sample2, $matches) > 0){
    printf("%s\n", $matches[0]);
    printf("%s\n", $matches[1]);    
}

?>

输出:

VALUES ('a','b','c',a,b)
'a','b','c',a,b

VALUES ('a','{a:b, "asd":"ads"}','c',a,b)
'a','{a:b, "asd":"ads"}','c',a,b

如果您需要从结果中获取每个值,请拆分,(如解析 CSV)

我希望这能帮到您 :)

于 2012-08-05T20:44:49.050 回答