我一整天都在搜索和寻找问题的解决方案,但找不到解决我问题的任何内容。我有一个查询需要通过正则表达式“分解”。我想获取选定的字段、表格和where条件之后的字段(不检查本身)。
SELECT `a`, `b`, `c` FROM `d` WHERE `e` > 1 OR `d` > 1
我的尝试如下所示:
/SELECT (?<selectedFields>(,*?)\`(.*?)\`) FROM (?<tableName>\`(.*?)\`) WHERE (?<checkFields>\`(.*?)\`)/
我遇到的问题是正则表达式在 where 条件的第一个字段之后停止。我得到的输出如下所示。
Array
(
[0] => Array
(
[0] => SELECT `a`, `b`, `c` FROM `d` WHERE `e`
)
[selectedFields] => Array
(
[0] => `a`, `b`, `c`
)
[1] => Array
(
[0] => `a`, `b`, `c`
)
[2] => Array
(
[0] =>
)
[3] => Array
(
[0] => a`, `b`, `c
)
[tableName] => Array
(
[0] => `d`
)
[4] => Array
(
[0] => `d`
)
[5] => Array
(
[0] => d
)
[checkFields] => Array
(
[0] => `e`
)
[6] => Array
(
[0] => `e`
)
[7] => Array
(
[0] => e
)
)
我需要在与所选字段相同的数组中使用“checkFields”。我究竟做错了什么?第二件事是正则表达式中的 selectFields 并不像预期的那样是包含每个字段名的数组,它由 ',' 分隔...
最佳答案
你不应该用正则表达式解析sql查询,因为用正则表达式解析sql查询与用正则表达式解析html非常相似。和this answer清楚地说明了为什么你不应该这样做。
你最好使用一些解析器(例如 this one )。
小样本:
$sql = 'SELECT `a`, `b`, `c` FROM `d` WHERE `e` > 1 OR `d` > 1';
$sqlParser = new PHPSQLParser($sql);
echo '<pre>';
print_r($sqlParser->parsed);
关于php - 正则表达式爆炸sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056217/