2009-10-06 70 views
1

我試圖從一個URL數組獲取控制器,方法和查詢。事情是這樣的:URL正則表達式爲PHP框架

'首頁/新聞/ [天]/[月]/[塞] /'

我需要一些正則表達式,這將給我下面的:

控制器:家 方法:新聞 參數:天,月,slu 012

對於參數,如果我能以某種方式在括號內獲取名稱,那麼我可以將它們放入PHP中的關聯數組中。例如:(「day」=> $ day)。

我真的堅持這一點,並試圖尋找幾個PHP框架的指導,但沒有真正實現我想要的上面,特別是使用正則表達式。

+1

我想你應該將參數委託給「主」控制器甚至是「新聞」方法。這不應該是前端控制者的業務。除此之外,你認爲擁有「家庭」控制器是個好主意嗎? – middus 2009-10-06 08:41:50

+0

感謝您的回覆。其實,家庭控制器只是一個例子,實際上它可能是新聞/文章/ 10/10/news-article-test /。 你是建議我只是採取所有的查詢,只是通過我的控制器很多? – Hanpan 2009-10-06 08:52:15

回答

3
preg_match('{/home/news/(?<day>\d{1,2})/(?<month>\d{1,2})/(?<slug>[\w-]+)}', 
      '/home/news/10/02/foo', 
      $matches); 

$matches現在

array (
    0 => '/home/news/10/02/foo', 
    'day' => '10', 
    1 => '10', 
    'month' => '02', 
    2 => '02', 
    'slug' => 'foo', 
    3 => 'foo', 
) 
+0

天才,謝謝。 – Hanpan 2009-10-06 09:55:09

3

如果你總是將不得不/:控制器/:方法/:你還不如使用args來爆炸:

$args = explode('/', $url); 
$controllerName = array_shift($args); 
$method = array_shift($args); 

$controller = new $controllerName; 
$response = $controller->$method($args); 
+0

嗯,問題是我想先路由我的網址,因爲我可能還想要/:controller /:item_id或其他東西。考慮一下,我認爲最好的方法是將正則表達式和上面的方法結合起來。非常感謝您的回覆。 – Hanpan 2009-10-06 09:51:06