2015-05-24 20 views
1

我想用真正的匹配使用正則表達式做一個路由器,但我總是堅持如何加載路由。正則表達式真正的匹配行爲

如果我有一個像

  • /路線:任何
  • /博客/:任何
  • /博客/分類/:任何

第一條路線將永遠成真,而不是使用第二路或第三路。

$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']; 

我該怎麼辦正則表達式/的preg_match才能得到正確的路由匹配?

+0

顯示'$ this-> routes','$ this-> tokens'和'$ url'是如何被填充的,或者至少是所有這些變量的示例值來獲得更好的想法可能是有幫助的發生。 –

+0

我認爲事情很簡單,但我也添加了這些。 – Filipe

回答

0

通常,在這種情況下,路徑規則應該寫成使得以下內容比前一條更普遍。他們做的工作的第一場比賽

同比應該把它們寫這樣:

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

這不是一個代碼錯誤。這只不過是執行的誕生與這個問題的作者討論的邏輯

UPDATE

假設我們要找到段的最大數量的匹配:

$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陣列

+0

確實如此,但如果您處於模塊狀態,則無法控制模塊的安裝方式。例如,如果模塊類別安裝在博客之後,博客路線將覆蓋類別路線。 必須有解決方案。 – Filipe

+0

@菲利普我寫的是許多cms中使用的做法。否則,如果你沿着路線走,並會發現10場比賽,你會執行哪些比賽。你有答案嗎? – splash58

+0

@Filipe如果一個模塊想要動態地添加路由,它不應該擴展先前的路徑,而是使自己如'/ auth',例如 – splash58