2015-06-10 77 views
0

我需要的是獲取SQL查詢中的所有賦值。我只對字符串和數字感興趣。例如:使用正則表達式在SQL查詢中分配賦值

SELECT * FROM my_table WHERE ((name="alex" AND age >= 24) OR gender =1) 
AND date = CURDATE() ORDER BY active = 1 LIMIT 1 

通過使用PHP的preg_match我想獲得包含以下值的數組:

$values = array(
    'alex'// name , 
    24 //age, 
    1  //gender, 
    1  //active 
); 

我用正則表達式初學者,所有我必須是這樣的:

preg_match_all('/\=\s*?(.*)\s*/', $sqlquery, $matches); 

這將返回單個匹配,找到第一個運算符後的一個匹配

+0

嗯,我不認爲使用正則表達式來做到這一點是明智的。你如何看待使用sql解析器? – Federkun

+0

我正在考慮將它們作爲'PDO :: execute'函數的參數發送。 – ali

+0

24在這裏不是一個賦值。這是一個比較值。 –

回答

2

喜歡的東西

/[a-zA-Z0-9]+\s*[><!]?=\s*(["a-zA-Z0-9]+)(?=\)|\s|$)/ 
  • [a-zA-Z0-9]+匹配等號的左邊

  • \s*匹配零個或多個空格。

  • [><!]? Character類,匹配><!

    • ?量詞,確保了前面的字符類occures零次或一次。
  • =匹配空間。

  • (["a-zA-Z0-9]+)匹配等於的右側。

  • (?=\)|\s|$)積極向前看。檢查的=右側後面的字符串\s)或結束$

測試

$string = 'SELECT * FROM my_table WHERE ((name="alex" AND age >= 24) OR gender =1) 
AND date = CURDATE() ORDER BY active = 1 LIMIT 1'; 

preg_match_all('/[a-zA-Z0-9]+\s*[><!]?=\s*(["a-zA-Z0-9]+)(?=\)|\s|$)/', $string, $matches); 
print_r($matches[1]); 
// Outputs 
// Array ([0] => "alex" 
//   [1] => 24 
//   [2] => 1 
//   [3] => 1) 
+0

'[a-zA-Z0-9] +將等號的左側匹配到''([「a-zA-Z0-9] +)匹配equals的右側表示? –

+0

很好的解釋。謝謝 – ali

+0

@papsk在表達式'x = 132':'x' - 等號的左邊,'123' - 等於的右邊 – Justinas

1

試着這麼做

[=>!<]\s?([\w"'\d\s]+(?:\(\))?) 
|____| | |________| |_____| 
Assign| op |   | 
    optional s|pace Optional function call 
      Any word, number, ", ' and space 

但是爲什麼你想要那個?也許你可以在不解析SQL的情況下從PHP那邊做出來?

+0

我想發送這些值作爲'PDO :: execute()'的參數。我認爲這將是最快的方式。沒有複雜的對象,只是發送查詢,解析器會「智能地」獲取可參數化的值。 – ali

+0

@ali但是,如果你已經有他們的查詢,比它會拋出錯誤,因爲沒有這樣的參數發現。 – Justinas