Php 正则表达式:SQL查询字符串匹配*或。*但计数(*)

Php 正则表达式:SQL查询字符串匹配*或。*但计数(*),php,mysql,regex,Php,Mysql,Regex,有这样一个查询字符串: select a.* from a select * from a 这应该是不允许和匹配的 但是:-) 这应该是允许的,不匹配 由于我的正则表达式知识贫乏,我有以下正则表达式 \bselect\b.*?(\*|\.\*).*?(?=\bfrom\b) 这个正则表达式可以与*或*配合使用,但我仍然在为允许的“count(*)字段选择而挣扎 Regex不是最受欢迎的部分,我试图弄清楚正面和负面的LookBehinds/LookAHeads。。。这仍然让我困惑 有什么提示吗

有这样一个查询字符串:

select a.* from a
select * from a
这应该是不允许和匹配的

但是:-)

这应该是允许的,不匹配

由于我的正则表达式知识贫乏,我有以下正则表达式

\bselect\b.*?(\*|\.\*).*?(?=\bfrom\b)
这个正则表达式可以与*或*配合使用,但我仍然在为允许的“count(*)字段选择而挣扎

Regex不是最受欢迎的部分,我试图弄清楚正面和负面的LookBehinds/LookAHeads。。。这仍然让我困惑


有什么提示吗?

尽管防止人们使用
select*from…
及其变体是非常明智的,因为当表被更改时,除非所需的列受到影响,否则他们的查询仍然有效,但您必须小心不要限制太多

这还会检入子查询:

\bselect(\s*\*\s*|.*\b[a-zA-Z_]\w*\s*\.\s*\*.*)from\b
它会再次检查简单的大小写
\b从\b
中选择\s*\*\s*,以及有效的表名,后面紧跟一个
*
,中间有可选的空格,但后者可以在
选择
中选择之间的任意位置

但它永远不会完美,例如,这是一个假阳性:

select 'select * from ' || b from a

什么应该匹配,什么不应该匹配的规则是什么?正则表达式正在PHP或mysql中使用?也许
^\b选择[^,]+from.*$
?为了正确理解,这是在PHP中使用正则表达式创建SQL解析器?你是对的。这是一个用PHP编写的SQL解析器。我只是想阻止这该死的*或。*;-)从a中选择6*b怎么样?
select 'select * from ' || b from a