0

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

search?q=chicken/page=2第一个正则表达式子模式在哪里chicken,第二个是2. 至于第二部分 where page=2,如果是第一页,我想让它成为可选的,即page=1. 因此,另一个 urlsearch?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按钮,我都会收到 search?q=[text] 请求。我如何强制它通过正则表达式匹配路线?

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

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

2 回答 2

0

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

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

您将需要使用如下路径:

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

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

于 2010-12-08T13:21:59.540 回答
0

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

search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))?
于 2010-12-08T13:22:24.580 回答