如何允许除第1部分和第2部分以外的所有部分?

时间:2011-01-04 20:53:09

标签: php zend-framework zend-route

这允许我轻松获得动态输入变量,而不是像/ en / etcetcetc那样放置静态前缀,但问题是所有控制器都被阻止。一切都进入索引/索引。

问题:我如何判断此规则是否允许现在更换,但不要跟踪它是否包含http://site.com/donotcatch/mehttp://site.com/iamnotbelongstodynamic1/blabla

  protected  function _initRoutes()
  { 
     ...
      $dynamic1 = new Zend_Controller_Router_Route(
            '/:variable0/:variable1',
            array(
                'controller' => 'index',
                'action'     => 'index'),
                array(
                      'variable0' => '^[a-zA-Z0-9_]*$',
                      'variable1' => '^[a-zA-Z0-9_]*$',
                    )
            );

跟进:

通常,我总是相信我们可以,所以,我们可以这样做,其中dynamic1不与我的其他静态控制器相互作用:

  // http://site/yeswecan/blabla
  // variable0 = yeswecan
  // variable1 = blabla
  $dynamic1 = new Zend_Controller_Router_Route(
        '/:variable0/:variable1',
        array(
            'controller' => 'index',
            'action'     => 'index'),
            array(
                  'variable0' => '^[a-zA-Z]*$',
                  'variable1' => '^[a-z0-9_]*$',
                )
        );


  // http://site/ajax/whatever...
  // solves it
  $dynamic2 = new Zend_Controller_Router_Route(
        '/ajax/:variable0',
        array(
            'controller' => 'ajax',
            'action'     => ''
            ),
            array(
                  'variable0' => '^[a-zA-Z0-9_]*$',
                )
        );

  // http://site/order/whatever...
  // solves it
  $dynamic3 = new Zend_Controller_Router_Route(
        '/order/:variable0',
        array(
            'controller' => 'order',
            'action'     => ''),
            array(
                  'variable0' => '^[a-zA-Z0-9_]*$',
                )
        ); 

注意:

  • 例如,控制器仍然失败了 http://site/ajax/whatever总是转到/ ajax / index,我希望将其作为/ ajax / user-inserted-value发送给

如何通过保持$ dynamic1 ??

来修复$ dynamic2和$ dynamic3

2 个答案:

答案 0 :(得分:1)

我认为Zend不支持使用“负面”匹配条件。幸运的是,正则表达式使用负向前瞻或后观:

每个例子,以下正则表达式:

(?!foo$|bar$)(?<!^foo|^bar)$

告诉正则表达式解析器排除完全foobar的匹配项。

fbarbfoofbarf仍然匹配。

注意:在上面的正则表达式中,[a-zA-Z0-9_]\w完全相同。

答案 1 :(得分:1)

嘿,现在听起来好像你只想让每个(ajax)动作都采取自己的行动。你是这个意思吗?如果是这样,我认为你可以使用它:

  $dynamic2 = new Zend_Controller_Router_Route(
        '/ajax/:action',
        array(
            'controller' => 'ajax'
            ),
            array(
                  'action' => '^[a-zA-Z0-9_]*$',
                )
        );

您还可以为与您的正则表达式不匹配的其余ajax调用添加更通用的一个:

  $dynamic1_and_a_half = new Zend_Controller_Router_Route(
        '/ajax/:variable',
        array(
            'controller' => 'ajax',
            'action' => 'index'
            )
        );

如果这不是您的意思,您是否也可以发布您的控制器,以及您想要/ ajax /任何电话的位置?