2010-12-08 104 views
0

我想創建一個Zend_Controller_Router_Route_Regex途徑來處理以下形式的網址:Zend的正則表達式路由幫助

search?q=chicken/page=2其中第一個regex子模式將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 = [文字]請求。我如何強制它通過正則表達式匹配路線?

這是我想做的事情,但是代碼不起作用

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

回答

0

/search?q=chicken/page=2不被Zend框架路由器可解析。路由器只會看到/search

該路由器依賴於服務器提供的路徑信息和任何後面的?是查詢字符串。

您需要使用的路徑,例如這樣的:

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

在這種情況下,你的正則表達式將變得簡單得多。

+0

感謝您的投入,現在我知道爲什麼我的搜索按鈕不起作用。我編輯了我原來的問題了解更多細節。 – nobody 2010-12-08 19:06:23

+0

我的答案仍然是答案。你想做的事對於請求字符串是不可能的,`/ search?q = chicken/page = 2`將導致pathinfo爲`/ search`,而`q`的單個$ _GET參數的值爲`chicken/page = 2` - Zend Framework路由器僅使用pathinfo。 – 2010-12-08 19:10:33

0

加入後,一?使第二部分optionnal:

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