2012-08-05 180 views
1

我工作的方法來獲取基於SQL查詢的所有值,然後在PHP中掃描它們。正則表達式捕獲組

這個想法是讓程序員在執行SQL查詢時對安全性不在意。

所以,當我嘗試執行此:

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

正則表達式需要捕捉'a' 'b' 'c' ab

我工作的這幾天。

這是因爲到目前爲止,我可以用2個正則表達式querys得到,但我想知道是否有更好的方法來做到:

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

基於以前的SQL將匹配:

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

第二正則表達式

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

將匹配

a b c a b 

當然,先前刪除VALUES

這種方式將匹配我要插入的很多值。

但是不適用於JSON。

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

對此有何幫助?

回答

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)

我希望這將幫助你: )

+0

似乎很好的工作!令人驚歎的正則表達式:P非常感謝!我會嘗試更多!謝謝! – nax 2012-08-07 09:21:58