使用正则表达式在SQL查询中分隔指定的值

时间:2015-06-10 11:09:22

标签: php regex

我需要的是在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);

将返回单个匹配,即第一个运算符找到后的匹配

2 个答案:

答案 0 :(得分:2)

这样的东西
/[a-zA-Z0-9]+\s*[><!]?=\s*(["a-zA-Z0-9]+)(?=\)|\s|$)/
  • [a-zA-Z0-9]+将等于的左侧与

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

  • [><!]?字符类,匹配><!

    • ?量词,确保前面的字符类出现零次或一次。
  • =匹配空间。

  • (["a-zA-Z0-9]+)匹配equals的右侧。

  • (?=\)|\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 )

答案 1 :(得分:1)

尝试类似

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

但你为什么要那样?也许你可以在没有解析SQL的情况下从PHP那里做到这一点?