PHP Regex拆分SQL字段列表

Cod*_*aft 6 php regex

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

我已经从查询的其余部分中提取了字段列表,所以我留下了一个字符串,可能看起来像:

field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic
Run Code Online (Sandbox Code Playgroud)

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

我想要实现的最终结果是找出哪些字段看起来是从表中直接选择,哪些字段是从SQL表达式中产生的,以便我以后可以决定是使用WHERE还是HAVING子句来过滤它们.

一旦我有了字段列表,我可以检查是否存在'AS'关键字虽然不完美,但应该按照我编写SQL的方式工作.

(奖励点用于建议另一种方法,即区分不是表达式但是有别名的字段,以及可能没有别名的表达式,或者可能但不使用'AS')

ale*_*oot 5

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

/,(?![^()]*+\\))/
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)