正则表达式真实匹配行为

时间:2015-05-24 17:27:18

标签: php regex match router

我尝试使用正则表达式进行真正匹配的路由器,但我总是陷入路由加载的方式。

如果我有像

这样的路线
  • /:任何
  • /博客/:任何
  • /博客/类别/:任何

第一条路线将永远实现,而不是使用第二条路线或第三条路线。

$data = array();

foreach($this->routes as $route => $rData) {

    if(strpos($route, ':') !== false) {
        foreach($this->tokens as $token => $value) {
            $route = str_replace($token, $value, $route);
        }
    }

    if(preg_match('#^'.$route.'$#', $url, $matches)) {
        $data['params'] = array_slice($matches, 1);
        $data = array_merge($rData, $data);
        break;
    }
}

路线:

$routes = array(
    '/:any' => callback,
    '/blog/:any' => callback,
    '/blog/category/:any' => callback
);

令牌:

$tokens = array(
    ':num' => '([0-9]+)',
    ':any' => '(.+)'
);

地址:

$url = $_SERVER['QUERY_STRING'];

如何使用regex / preg_match来获得正确的路由匹配?

1 个答案:

答案 0 :(得分:0)

通常情况下,在这种情况下,路线规则的编写方式应使下列内容比前一个更为通用。他们在第一场比赛中

Yoy应该这样写:

$routes = array(
    '/blog/category/:any' => callback
    '/blog/:any' => callback,
    '/:any' => callback,
);

这不是代码错误。它只是执行逻辑

更新源自与问题作者的讨论

假设我们想要找到具有最大段数的匹配项:

$routes = array(
    '/:any' => 'callback1',
    '/blog/:any' => 'callback2',
    '/blog/category/:any' => 'callback'
);

foreach ($routes as $in => $out) 
    $counts[$in] = count(explode('/', $in)); 
arsort($counts);
foreach ($counts as $in => $count) 
    $newroutes[$in] = $routes[$in];

var_dump($newroutes);

返回

array(3) {
  ["/blog/category/:any"]=>
  string(8) "callback"
  ["/blog/:any"]=>
  string(9) "callback2"
  ["/:any"]=>
  string(9) "callback1"
}

然后使用此newroutes数组