从SQL查询中提取所有表

时间:2012-10-14 13:30:30

标签: php regex

我想为表添加前缀,并且最近编写了一个PHP脚本来提取字符串SQL查询中的所有表。

$sql = 'UPDATE festivals SET desc = "Starts from July"';
preg_match_all('/(from|into|update|table|join) (`?\w+`?)\s/i', $sql, $matches);

它运行良好,但唯一的问题是它提取July因为它没有区分SQL值和实际表名,所以它假设July也是一个表。

现在我认为解决方案应该是防止提取包含在单引号或双引号中但不知道如何做到这一点的内容。

2 个答案:

答案 0 :(得分:0)

如果你的查询编写更严格,你可以将所有数据库,表格和列名称包装在反引号`中,并且它们非常容易提取 - 只需获取字符串之间的第一个匹配项他们:只需要反引号而不是可选。

那就是说,我不完全确定你的正则表达式是如何匹配from July的,因为July后面没有空格...

答案 1 :(得分:0)

你的正则表达式更好:

"/((?:^select .+?(?:from|into))|^update|^table|join) (`?\w+`?)\s/I"

但我仍然同意nvartolomei。