我正在寻找一个模式以获取此类SQL查询的表名;
INSERT INTO table(uuid,type) VALUES (?,?)
我希望得到" table"
我有一个模式,但只有在没有括号的情况下它才有效 INSERT INTO表VALUES(?,?)
[从|到|更新] \ S +(?:\。W +)的(\ W +)(\ S $ | \ S +(WHERE))
由于
中的模式不同答案 0 :(得分:3)
这绝不是从SQL中提取表名的非常简单的方法。但是这里是使用你需要的正则表达式解决问题的方法。您已在提供的表达式中指定了WHERE部分,但如果您只需要名称,是否真的有必要?
if (isset($_POST['fruity'])) {
$start_fruity = new Fruity_draft($_POST);
echo $start_fruity->get_json_response();
}
class Fruity_draft {
private $postData;
function __construct($postData) {
$this->postData = $postData;
}
function get_json_response() {
return json_encode($this->postData['banned']);
}
}
请注意,可以通过多种方式格式化SQL语句,并且任何人都不可能想出一个能够以您需要的方式解析SQL的表达式。
答案 1 :(得分:1)
正如人们已经提到的,正则表达式不是用于从SQL查询中提取表名的完全证明解决方案......因为必须考虑大量事情,这在RegX中表达起来会比较棘手,并且会在一个中突破或其他情况......
那么什么?完整的证明sql解析器,如JSQL解析器?好吧,如果你只需要从SQL中提取表名,那么完整的sql解析器就会被淘汰,而且大多数解析器都不支持所有的方言,你可能最终会修改你需要的语法文件,只是为了提取表名。
为此,我编写了一个small library来解析来自SQL的表名,几乎没有80行物理代码,它几乎适用于任何SQL。 有关详细信息,请参阅unit test cases。
答案 2 :(得分:1)
想出了这个合并所有其他答案和我的用例。
sed 's/2048x2048[^,"]*/2048x2048 +1280+0/g;
s/1280x1024[^,"]*/1280x1024 +640+0/g;
s/1920x1080[^,"]*/1920x1080 +0+1024/g' /etc/X11/xorg.conf
如果您使用 postgres 或重新组合表格的内容,它还会获取 INFORMATION_SCHEMA.TABLES 之类的内容。
我用来测试的以下测试字符串
(?ims)\b(?:FROM|JOIN|UPDATE|INTO)\s+(\w+(?:\.\w+)*)
答案 3 :(得分:0)
绝对不是万无一失,但可能是一个好的开始:(?i)(SELECT|JOIN)(?=((\s+)(\`?)(?P<entity_name>[A-Za-z0-9_$""]*)(\`?)(\s)))
答案 4 :(得分:0)
对我来说,引号(?is)\b(?:from|into|update)\s+(\w+)
之间的表名不起作用,我改为对所有查询都起作用,如“ table_name”或“ table_name”或“ table_name”
(?is)\b(?:from|into|update)\s+[|'|"]([^|'|"]+)[`|'|"]