2012-10-21 63 views
3

我有一個包含所有路由/ URL及其路徑數組,PHP路由基於陣列,如何搭配*任何東西

Example : $route = array(
'/' => 'files/index.php', 
'pages' => 'files/pages.php', 
'pages/add' => 'files/page-add.php', 
'posts/*' => 'files/posts.php', 
) 

使用array_key_exists()我檢查數組中是否存在路由是的,然後加載它的路徑,如果找到了直接匹配,它就會起作用。

我希望它匹配posts/*路徑,每當請求posts/anything, posts/view/10,我不能這樣做使用array_key_exists()。

你們有什麼想法/建議我應該使用哪種方法?

+1

我會說你解決了錯誤的問題,看看你可以用你的.htaccess文件做什麼,因爲這將很容易映射到文件路徑。 –

+0

是的它的確如此,但我使用的是類似架構的插件,一旦插件被激活,它就可以註冊路由,這些路由被存儲在數組中,這有助於提高性能,並且我仍然可以像系統一樣獲得插件... I我使用htaccess以及 –

回答

4

做的兩種策略的組合:

  • 堅持使用的直接匹配你的「路由陣」,即具有良好的性能安全的解決方案。
  • 對於沒有直接匹配的其他請求,嘗試使用其他策略(如基於正則表達式的模式匹配),通常使用phps preg_match()函數。這給你無盡的可能性來描述模式,儘管它顯然比尋找直接匹配慢。
+0

好吧,這是有道理的,我會試一試。謝謝。 –

0

您可以使用array_key_exists(),它會失敗,然後嘗試檢測密鑰中的*的路由。

if (array_key_exists($url, $route)) { 
    // Serve normally. 
} else { 

    $route = array_filter($route, function($route) { 
        if (substr($route, -1) != "*") { 
         return FALSE; 
        } 

        return (substr($url, 0, strlen($route)) != substr($route, 0, -1)); 
       }); 

    if ($route) { 
     // Serve normally. 
     $route = end($route); 

    } else { 
     // Route wasn't matched. 
    } 

} 
+0

感謝隊友,類似於我的想法。 –