我想匹配字符串中的最后一个“order by”(例如$ matches [1] = doo.time)我可以看到问题出在(.*)
部分,但不知道要改变什么因为它需要任何角色,任何想法?
$sql = "SELECT foo FROM blah ORDER BY foo.date ORDER BY doo.time";
if (preg_match('/ORDER BY\s(.*)$/i', $sql, $matches)) {
echo "<pre>";
print_r($matches); exit;
}
答案 0 :(得分:3)
你可以贪婪地匹配(不捕捉)它之前的一切。这将强制模式的其余部分仅匹配最后一个ORDER BY。这对我有用。
$sql = "SELECT foo FROM blah ORDER BY foo.date ORDER BY doo.time";
if (preg_match('/(?:.*)ORDER BY\s(.*)$/i', $sql, $matches)) {
echo "<pre>";
print_r($matches); exit;
}
答案 1 :(得分:2)
如果您只是在寻找列名,请尝试以下方法:
if (preg_match('/.*ORDER BY\s(.*?)(?:ASC|DESC)?\s*(?:LIMIT.*)?$/i', $sql, $matches)) {
echo "<pre>";
print_r($matches); exit;
}