【发布时间】:2015-02-12 11:56:36
【问题描述】:
我正在尝试从任何给定的 MySQL 查询中匹配并提取所有表名和列。
给定的查询不加引号(反引号),根据 MySQL 的命名规则是:
不带引号的标识符中允许的字符:
ASCII:[0-9,a-z,A-Z$_](基本拉丁字母,数字 0-9,美元,下划线)
扩展:U+0080 .. U+FFFF
对于一个测试用例,我正在使用这个查询:
SELECT users.id , users.first_name ,users.last_name, roles.role,avatars.img_name,timezone.gmt_offset
FROM users
LEFT JOIN roles ON users.role = roles.id
LEFT JOIN avatars ON users.avatar=avatars.id
LEFT JOIN country ON users.country=country.country_code
LEFT JOIN timezone ON users.timezone = timezone.id
WHERE (users.id >=2 AND users.id <=4 ) OR (roles.role LIKE 'us%')
OR (roles.role = 'user(complex.sit )' && (timezone.gmt_offset >=7200
OR users.last_name ='tryme'))
LIMIT 0 , 30
到目前为止我的正则表达式:
%[ .(),]?([a-z0-9_$]{2,})[ .(),]?(?!AND|OR|LIKE|SELECT|JOIN|ON)%i
我正计划捕获该组并将其替换为带有反引号的匹配换行问题是我也无法过滤掉正在匹配的保留字(SELECT,JOIN ....),我尝试添加一个否定的前瞻,但它不起作用。
第二个问题是示例= 'user(complex.sit )' 中的值,我不希望它与这两个词匹配(复杂的坐姿)。
有什么建议吗?
【问题讨论】: