我试图解析 PHP 中的 SQL 选择语句。我的示例仍然不完整,我的最终目标是拥有以下捕获组:
- 柱子
- 功能
- 别名
- 删除反引号 (`)
一个很好的可能是提取concat(g.col1, p.col2)。
目前我有以下正则表达式:
(?P<column>[\w.]++(?=\s*+))(?:(?:\s++as\s++)(?P<alias>[\w]++))*
示例语句:(示例中没有 SELECT 或 FROM。我从 Doctrine 的 DBAL Querybuilder 中提取了这个 DQL 字符串。
g.creation_dt as creatiodfasn, g.creation_dt, g.creation_dt as creation, abs(g.pkid) as pkid
这为我提供了列组的以下数组:
column' =>
array (size=7)
0 => string 'g.creation_dt' (length=13)
1 => string 'g.creation_dt' (length=13)
2 => string 'g.creation_dt' (length=13)
3 => string 'abs' (length=3)
4 => string 'g.pkid' (length=6)
5 => string 'as' (length=2)
6 => string 'pkid' (length=4)
对于别名:
'alias' =>
array (size=7)
0 => string 'creatiodfasn' (length=12)
1 => string '' (length=0)
2 => string 'creation' (length=8)
3 => string '' (length=0)
4 => string '' (length=0)
5 => string '' (length=0)
6 => string '' (length=0)
是否有任何 REGEX 大师可以帮助我解决这个问题?顺便说一句:我查看了一个 PHP 库:https ://code.google.com/p/php-sql-parser/ 这可以完成这项工作,但我希望先用正则表达式解决它,因为速度是这个问题的优先考虑.
谢谢
更新: 我正在尝试从从 Doctrine DBAL 或 ORM 查询构建器中检索到的 DQL 语句中提取整个选择部分。
工作流程:
- DB Engineer 编写了一个返回查询构建器的服务。(例如,table.column1 作为column1,table.column2 作为column2,table.column3 作为column3)
- JQuery Datatables 后端将检查数据表配置(PHP 类)并询问所有请求列(例如 column1、column2)。
- PHP 后端必须检查查询构建器是否包含两个配置的列(这些是别名)。
- 客户端将根据别名(例如 column1)请求过滤。
- PHP 后端必须转换别名(在 querybuilder 中定义的 column1 到 table.column1)才能添加正确的 where 语句。
而已 :)