通过preg_match像SQL中那样分解字符串


explode a string like in SQL by preg_match

我想像SQL 中那样分解字符串

这是我的代码:

<?php
$subject = 'select onlineid from onlinelist where online_user_name=6565 order by htrdh limit 1';
preg_match('/^(select|SELECT) (?P<select>(.+)) (from|FROM) (?P<from>(.+)) ((where|WHERE) (?P<where>(.+))) ((order by|ORDER BY) (?P<order>(.+)))? ((limit|LIMIT) (?P<limit>(.+)))?$/', $subject, $matches);
echo @$matches["select"]."<br>".@$matches["from"]."<br>".@$matches["where"]."<br>".@$matches["order"]."<br>".@$matches["limit"];

输出将是:

onlineid
onlinelist
online_user_name=6565
htrdh
1

工作良好。。。但如果我删除order bylimit,它就不起作用。

如果$subject中存在whereorder bylimit,则必须将值

您的?不包括空格。

不正确:... (ORDER BY ...)? (LIMIT ...)?

正确:...( ORDER BY ...)?( LIMIT ...)?

https://www.regex101.com/r/mE8qK5/1

我还建议您将?添加到.+子模式中,这样它就不会贪婪地(懒惰地)匹配

在正则表达式的上下文中,懒惰和贪婪是什么意思?

Regex很棘手,除非您了解它的各个方面,否则您应该始终小心使用它。我还建议将/I用于不区分大小写的

https://www.regex101.com/r/hM9aC7/1

/^select's+(?<columns>.*?)'s+from's+(.*?)?((where's+(?<where>.*?))?(order by's+(?<order>.*?))?(limit's+(?<limit>(.*?)))?);/i