Php 正则表达式字符串结束问题

Php 正则表达式字符串结束问题,php,regex,Php,Regex,我想匹配字符串中的最后一个“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>"; pri

我想匹配字符串中的最后一个“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;
}
$sql=“按foo.date按doo.time从blah ORDER中选择foo”;
if(preg_match('/ORDER BY\s(.*)$/i',$sql,$matches)){
回声“;
打印($matches);退出;
}

如果只查找列名,请尝试以下操作:

$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;
}
if(preg_match('/.*ORDER BY\s(.*?(:ASC | DESC)?\s*(?:LIMIT.*)$/i',$sql,$matches)){
回声“;
打印($matches);退出;
}

如果只查找列名,请尝试以下操作:

$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;
}
if(preg_match('/.*ORDER BY\s(.*?(:ASC | DESC)?\s*(?:LIMIT.*)$/i',$sql,$matches)){
回声“;
打印($matches);退出;
}
您可以贪婪地匹配(无需捕获)之前的所有内容。这将强制模式的其余部分仅与上一个订单匹配。这对我有用

$sql=“按foo.date按doo.time从blah ORDER中选择foo”;
if(preg_match('/(?:*)ORDER BY\s(.*)$/i',$sql,$matches)){
回声“;
打印($matches);退出;
}
您可以贪婪地匹配(无需捕获)之前的所有内容。这将强制模式的其余部分仅与上一个订单匹配。这对我有用

$sql=“按foo.date按doo.time从blah ORDER中选择foo”;
if(preg_match('/(?:*)ORDER BY\s(.*)$/i',$sql,$matches)){
回声“;
打印($matches);退出;
}

@fire:order by是否有任何
ASC
DESC
关键字?@fire:order by是否有任何
ASC
DESC
关键字?如果regex对您不重要,您可以使用可能更快的strripos。如果regex对您不重要,您可以使用可能更快的strripos。
(.*)$
也可以,而不是
(.*?)$
@Tim:是的,谢谢。这是我以前用
/orderby\s(.*)$/i
/orderby\s(.*)$/iU(
(.*)$
做的实验留下的,它也可以代替
(.*)$
。@Tim:是的,谢谢。这是我之前用
/orderby\s(.*)$/i
/orderby\s(.*)$/iU
进行的实验留下的。