2009-10-06 31 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