Zend Route Regex:将Url的控制器段与“home”匹配

时间:2009-12-06 00:01:34

标签: regex zend-framework

我正在使用以下格式处理Urls:“controller / action”,其中需要斜杠。

我需要创建一个PCRE正则表达式来匹配控制器和操作名称,除非控制器名称的值为“home”。例如:

  • “member / update”应生成“member”,“update”
  • “admin / index”应该生成“admin”,“index”
  • “home / index”应该生成<nomatch>

我一直在寻找前方,后方和周围,我有部分工作,但没有完全正确的解决方案。任何帮助表示赞赏。

**编辑
这是一个更多的背景。我想设置Zend路由以便

  • 只有一部分'/ foo'的网址发送到HomeController,即'/ home / foo'
  • 具有两个部分'/ controller / action'的任何url调度到该控制器:例如,'/ member / update'调度到MemberController,'/ member / update'; '/ home / index'调度到HomeController等。

现在我的路线设置为:

$router->addRoute('homeRoute', 
    new Zend_Controller_Router_Route(
        ':action',
        array('controller' => 'home', 'action' => 'index')
    )
);
$router->addRoute('memberRoute', 
    new Zend_Controller_Router_Route(
        'member/:action',
        array('controller' => 'member', 'action' => 'index')
    )
);
// and so on, a route for each non-Home controller: adminRoute, etc

这是我想要的方式,但它很难看,也是一个维护问题。我想用一条Regex路线替换所有路线'memberRoute','adminRoute'等:

$router->addRoute('siteRoute',
    new Zend_Controller_Router_Route_Regex(
        '????/:action',
        array('action' => 'index'),
        array(?? => 'controller')
    )
);

我一直用一些像以下的PHP脚本运行我的正则表达式实验:

<?php
    preg_match('/????/', 'home/index', $output);
    echo '0=>'.$output[0].';';
    echo '1=>'.$output[1].';';
?>

3 个答案:

答案 0 :(得分:0)

我认为正则表达式不是解决方案。我之前从未使用过zend框架,但在PHP中它可能就是这样的

$string = "controller/action";
$pieces = explode('/', $string);
if ($pieces[0] == 'home') {
  // special code here
} else {
  // other code here
}

答案 1 :(得分:0)

当我听到“..匹配所有某事”时,我想也许应该翻一下:如何匹配只是的东西,或者在这种情况下,'家'控制器?

// added last to be checked first
$router->addRoute(
  'home',
  new Zend_Controller_Router_Route(
    'home/:action',
    array('controller'  => 'home')
  )
);

答案 2 :(得分:-1)

(?:home.*)|([^/]*)(?:/(.*))?