正则表达式捕获组内

时间:2012-08-05 18:12:24

标签: sql regex

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

这个想法是让那些在进行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" ....}

对此有何帮助?

1 个答案:

答案 0 :(得分: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)

我希望这会对你有所帮助:)。