PHP 正则表达式来拆分 SQL 字段列表


PHP Regex to split an SQL field list

我正在寻找一个正则表达式来从 SQL SELECT 语句中拆分字段列表。

我已经从查询的其余部分中提取了字段列表,因此我留下了一个可能如下所示的字符串:

field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic

我认为合乎逻辑的方法是在逗号上拆分字符串,前提是逗号不会出现在参数中,所以我只需要找到正确的正则表达式来做到这一点......?

我试图实现的最终结果是找出哪些字段似乎是从表中直接选择的,哪些字段是由SQL表达式组成的,以便我以后可以决定是否使用WHERE或HAVE子句过滤它们。

一旦我有了字段列表,我就可以检查是否存在"AS"关键字,尽管它并不完美,但应该适用于我编写 SQL 的方式。

(建议另一种方式的奖励积分,该方式在不是表达式但已别名的字段与可能未使用别名的表达式之间有所不同,或者可能没有使用"AS")

这个正则表达式应该可以工作:

/,(?![^()]*+''))/

PHP中的一个示例实现,在这里:

$vv = 'field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic';
$arr = preg_split ("/,(?![^()]*+''))/", $vv);
foreach ($arr as &$value) {
    print($value);
}

在解析像SQL这样的不规则语言时,你应该始终使用适当的解析器而不是一些正则表达式。

在您的情况下,您可以在PHP或PEAR的SQL_Parser中使用此SQL解析器。