Справка Zend Regex Route

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

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);

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

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

РЕДАКТИРОВАТЬ №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 ));
    }

person nobody    schedule 08.12.2010    source источник


Ответы (2)


/search?q=chicken/page=2 не обрабатывается маршрутизатором Zend Frameworks. Роутер увидит только /search.

Маршрутизатор полагается на информацию о пути, предоставленную сервером, и все, что следует после ? является строкой запроса.

Вам нужно будет использовать такой путь:

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

В этом случае ваше регулярное выражение станет намного проще.

person Darryl E. Clarke    schedule 08.12.2010
comment
Спасибо за ответ, теперь я знаю, почему моя кнопка поиска не работает. Я отредактировал свой исходный вопрос для более подробной информации. - person nobody; 08.12.2010
comment
Мой ответ остается ответом. То, что вы пытаетесь сделать, невозможно со строкой запроса /search?q=chicken/page=2, что приведет к тому, что информация о пути будет /search, а одиночный параметр $_GET q будет иметь значение chicken/page=2 — маршрутизатор Zend Framework использует ТОЛЬКО информацию о пути. - person Darryl E. Clarke; 08.12.2010

сделайте вторую часть необязательной, добавив после нее ?:

search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))?
person Toto    schedule 08.12.2010
comment
Спасибо за вклад, дополнительный ? действительно исправляет регулярное выражение, но моя маршрутизация все еще не работает по причине, указанной Дэррилом. - person nobody; 08.12.2010