Zend Regex Route帮助

时间:2010-12-08 10:58:02

标签: regex zend-framework http-get zend-route

我正在尝试创建一个Zend_Controller_Router_Route_Regex路由来处理以下格式的URL:

search?q=chicken/page=2,其中第一个正则表达式子模式为chicken,第二个属性为2。对于page=2的第二部分,如果它是第一页,我想让它成为可选项,即page=1。因此,search?q=chicken等其他网址也有效,相当于search?q=chicken/page=1

这是我的尝试,虽然没有任何成功,但是为了让你更好地了解我想要做的事情。


        $route = new Zend_Controller_Router_Route_Regex(             
            'search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))',
            array( 
                'page'=> '1',
             'module' => 'default', 
             'controller' => 'search', 
             'action' => 'index' ), 
            array( 1 => 'query', 2 => 'page' ),
            'search?=%s/page=%d');
        $router->addRoute('search', $route);

这里的问题是我无法构建正确的正则表达式。

提前致谢。

编辑#1

正如MA4所指出的,正确的正则表达式是'search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))?'

达里尔指出了真正的问题。以下是更多信息,以便对事物进行透视。

我的搜索文本框和按钮

    <form action="/search" method="get">
            <input type="text" name="q" />
            <input type="submit" value="Search" />
    </form>

每次按下search按钮,我都会进行搜索?q = [text]请求。如何强制它通过正则表达式匹配路线?

这是我想要做的,但代码不起作用

    if($this->getRequest()->getParam('query')){
        // redirect success
    } else {
        $url = "search?q=" . $this->_getParam('q');            
        $this->_redirect(route('search'), array('code' => 301 ));
    }

2 个答案:

答案 0 :(得分:0)

/search?q=chicken/page=2无法由Zend Frameworks的路由器解析。路由器只会看到/search

路由器依赖于服务器提供的路径信息和之后的任何内容?是查询字符串。

您需要使用如下路径:

/search/[word]        (default page 1)
/search/[word]/[page] 

在这种情况下,你的正则表达式会变得简单得多。

答案 1 :(得分:0)

通过在其后添加?使第二部分成为可选项:

search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))?
相关问题