0

我试图解析 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 语句。

而已 :)

4

0 回答 0