【问题标题】:PHP (regex): Extract column names from SQL-QueryPHP(正则表达式):从 SQL 查询中提取列名
【发布时间】:2020-04-24 13:57:41
【问题描述】:

我正在努力解决 PHP 中的正则表达式:

我有许多 SQL 查询。现在,我想在这些查询中提取变量名(列名)。它应该返回一个数组(preg_match_all())

由于查询相当简单,因此不需要完美的解决方案。我想检查的唯一条件如下:

  • 返回任意长度的所有字符串 (a-zA-Z0-9)
  • 从以下表达式之一开始:“WHERE”、“AND”、“OR”、“WHERE (”、“AND (”、“OR (”和
  • 在以下表达式之一之前结束:“=”、“>”、“
  • 所有这些表达式都应该不区分大小写。

我正在使用以下在线正则表达式测试器:https://www.phpliveregex.com/#tab-preg-match-all。但是,我得到的最接近的是这个,因为我不知道如何获得多个匹配项:

preg_match_all('/^[where|and|or|\(]* ([a-zA-Z0-1]*)[ |=|<|<=|>|>=|or|in]*.*$/', $input_lines, $output_array);

一些示例 SQL 查询:

                                                       SHOULD RETURN
WHERE var1=1 AND var2=1                                => var1; var2
WHERE var2 IN (1, 2, 3) OR var3=2                      => var2; var3
WHERE (var4 like '%test%' and var5 NOT LIKE '%test%')  => var4; var5
WHERE VAR6 = 'test' AnD var7='test2'                   => VAR6; var7

【问题讨论】:

  • 我会使用图书馆,而不是自己拼凑一些东西……code.google.com/archive/p/php-sql-parser
  • 如果您可以访问数据库,有更好的方法来查询列名本身。
  • @Wimanicesir 不幸的是,我没有。

标签: php regex preg-match-all


【解决方案1】:

我们开始吧(当然不是 100% 完美):

(?:(?i)WHERE|AND|OR) \(?([a-zA-Z0-9]+)

a demo on regex101.com.

【讨论】:

  • 非常感谢,这已经接近完美了 ;-)
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多