2012-10-14 73 views
3

我想为表添加前缀,并且最近编写了一个PHP脚本来提取字符串SQL查询中的所有表。从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

你应该真的考虑这个问题:http://stackoverflow.com/questions/281041/regular-expression-to-find-all-table-names-in-a-query。 – nvartolomei

+0

谢谢,但这是另一个问题,因为我想添加一个前缀到表,并不关心空白,别名或等 – Omid

+0

你试过我建议在下面的正则表达式? –

回答

0

你的正则表达式是关闭这种方式更好:

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

但我仍然同意nvartolomei。

+0

它没有任何工作 – Omid

+0

这是你的测试用例的红宝石味道。你用什么口味? –

+0

我们可以聊天吗? – Omid

0

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

这就是说,我不完全知道如何您正则表达式,因为July是匹配from July后面没有空格...

+1

是真的,没有选择那个。也许他没有真正测试它,只是提出了一个假设情景。 –

+0

@Kolink使用反引号将是一个好主意,但只是当你是唯一的开发者而不适用于团队合作时。而关于'七月'这只是一个例子 – Omid

+0

如果你(或你的团队)不能遵循正确的标准,那么你不能用正则表达式来处理任务。你会有更多的运气自己解析查询并提取表。或者,您可以在查询的开头放置'explain',运行它,然后查找查询摘要中列出的表。 –