Помощь Zend Regex Route - PullRequest
       14

Помощь Zend Regex Route

0 голосов
/ 08 декабря 2010

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 декабря 2010

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

search\?q=([a-zA-Z0-9]+)(?:/page=(\d+))?
0 голосов
/ 08 декабря 2010

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

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

Вам потребуется использовать такой путь:

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

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

...