2010-12-08 3 views
0

Я пытаюсь создать маршрут Zend_Controller_Router_Route_Regex для обработки URL-адреса в следующем виде:Zend Regex Маршрут помочь

search?q=chicken/page=2 где первый подшаблон регулярного выражения будет chicken и второй один будет 2. Что касается второй части, где page=2, я хочу сделать это необязательным, если это первая страница, то есть page=1. Таким образом, еще один url, такой как 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); 

Проблема в том, что я не могу составить правильное регулярное выражение.

Заранее спасибо.

EDIT # 1

Правильное регулярное выражение, как указывал МА4, является '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, я получаю д = [текст] запрос поиска?. Как заставить ее пройти маршрут соответствия регулярному выражению?

Вот что я хочу сделать, однако код не работает

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` и единственным параметром $ _GET для `q`, имеющим значение` chicken/page = 2` - маршрутизатор Zend Framework использует ТОЛЬКО pathinfo. – 2010-12-08 19:10:33

0

сделать вторую часть optionnal путем добавления ? после него:

search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))? 
Смежные вопросы