4

我想为表添加前缀,最近编写了一个 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也是一个表。

现在我认为解决方案应该是防止提取包含在单引号或双引号中的内容,但不知道该怎么做。

4

2 回答 2

0

如果您的查询编写更加严格,您会将所有数据库、表和列名包装在反引号中`,并且它们将非常容易提取 - 只需获取它们之间的字符串的第一个匹配项:只需使用反引号代替的可选。

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

于 2012-10-14T13:35:39.557 回答
0

你的正则表达式最好这样:

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

但我仍然同意 nvartolomei。

于 2012-10-14T13:37:29.450 回答