php - 使用正则表达式解析 SQL,排除带引号的文字

标签 php mysql regex parsing

对于我的 DBAL,我需要解析提供的 SQL [特别是 mysql 方言] 字符串以找到所有占位符。

但是,当然,我不想解析任何类似占位符的组合,这些组合偶尔可能会出现在引用的文字中 - 无论是单引号、双引号还是反引号。

可以这样说

SELECT amount as `Amount: boxes` FROM t WHERE q='howdy?' and a='I\'m OK' and category=?

只有最后一个问号是唯一的实际占位符

鉴于大量的转义规则,其中一些取决于当前的数据库设置(NO_BACKSLASH_ESCAPESANSI_QUOTES 等),这可以将上述查询转换为

SELECT amount as "Amount:boxes" FROM t WHERE q='howdy?' and a='I''m OK' and category=?

我怀疑这个任务是否可行。

但是,我仍然希望它能够完成,甚至可能有人手头有解决方案。

最佳答案

您要查找的一般模式是 /string(*SKIP)(*F)|\?/ 其中 string 是匹配字符串的正则表达式。我不太熟悉 SQL 字符串语法。一些建议:

  • 带反斜杠转义的单引号:'[^'\\]*(?:\\.[^'\\]*)*'
  • 带引号重复转义的单引号:'[^']*(?:''[^']*)*'

例如带有反斜杠和重复转义的单引号、双引号和反引号的完整正则表达式可能如下所示:

/(?:
    '[^'\\]*(?:(?:\\.|'')[^'\\]*)*'
  | "[^"\\]*(?:(?:\\.|"")[^"\\]*)*"
  | `[^`\\]*(?:(?:\\.|``)[^`\\]*)*`
 )(*SKIP)(*F)| \?
/x

将其与 preg_match_allpreg_replace_callback 匹配,具体取决于您想要什么。

注意:为避免额外的转义,将正则表达式放在 NOWDOC 字符串中。

关于php - 使用正则表达式解析 SQL,排除带引号的文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22266311/

相关文章:

php - 如何在此 SQL 查询中返回 SUM(摘要)

PHP FFmpeg 无法在 windowsxp 和实时网站上运行,在 ubuntu 中运行相同的代码

sql - Snowflake - 检查字符串是否为字母数字?

regex - 使用正则表达式识别 pandas 列中的模式和清理数据

php - 显示每个用户创建的行数

php - 服务器问题空白页 - Apache、Linux、Joomla

mysql - 将行更新为另一个表中未设置的行的副本

mysql - 根据另一个表中的发件人、收件人 ID 从用户表中选择数据

sql - 错误 1005 (HY000) : Can't create table when using foreign keys

用于匹配 MongoDB 字符串的正则表达式