2

我整天都在寻找和寻找解决我的问题的方法,但找不到任何适合我的问题的方法。我有一个需要通过正则表达式“分解”的查询。我想在 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 不是预期的每个字段名的数组,它由','分隔......

4

2 回答 2

4

您不应该使用正则表达式解析 sql 查询,因为使用正则表达式解析 sql 查询与使用正则表达式解析 html 非常相似。这个答案清楚地说明了为什么你不应该这样做。

你最好使用一些解析器(例如这个)。

小样本:

$sql = 'SELECT `a`, `b`, `c` FROM `d` WHERE `e` > 1 OR `d` > 1';
$sqlParser = new PHPSQLParser($sql);
echo '<pre>';
print_r($sqlParser->parsed);
于 2012-12-27T14:34:00.270 回答
1

使用 REGEX,您不会走得太远。考虑所有可能的 SQL 查询:

SELECT * FROM tbl1 JOIN tbl2 
SELECT field as field2 FROM table1 as alias
etc

为此,您需要一个解析器。试试:http ://code.google.com/p/php-sql-parser/

此外,我什至建议您根本不要解析 SQL,数据库中内置的 SQL 解析器非常复杂,模仿它们的行为并不容易。

如果您需要这样的行为,您可以创建一个简单的类来执行相反的操作(构建您的 SQL),例如:

$s = new SQL();
$s->setFrom('table');
$s->addCondition('condition1','value1');
$s->select('*');  //> outputs SELECT * FROM table WHERE condition1 = 'value1'

所以你可以有一个方法来检索所有部分:

$s->getConditions();
$s->getSelect();
于 2012-12-27T14:32:29.723 回答