我正在尝试创建一个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);
这里的问题是我无法构建正确的正则表达式。
提前致谢。
正如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 ));
}
答案 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+))?