php - 正则表达式爆炸sql查询

标签 php regex

我一整天都在搜索和寻找问题的解决方案,但找不到解决我问题的任何内容。我有一个查询需要通过正则表达式“分解”。我想获取选定的字段、表格和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/

相关文章:

php - 回显重复列值的详细信息

php - CSS3 使表格更适合

php - 从 Woocommerce 订单/WC_Order 对象获取订单备注?

regex - 如何使用正则表达式模式匹配具有固定前缀的可变长度单词?

正则表达式PCRE捕获URL中的多次出现查询字符串

c# - 如何以任意序列搜索模式?

javascript - 将 Carrage 返回转换为 br 标签

php - 使用 PDO 在一个表中查找记录并将数据追加到另一个表中

regex - .htaccess RewriteRule 使用查询字符串重写条件,但不将查询字符串添加到最终网址

java - PHP 与 Java 是否存在能耗差异?