2015-02-26 3 views
0

После обновления моей версии CakePHP с 2.2.2 до 2.6.2 один из моих маршрутов перестает работать должным образом.Правильное задание регулярного маршрута CakePHP

Router::connect('/articles/:keywords', array('action' => 'search', 'controller' => 'Articles', 'keywords' => null), array('pass' => array('keywords'), 'keywords' => '[A-Za-z0-9\+_]+')); 

Он принимает входной сигнал, такие как «мир» и «Мир новостей» + через URL, такого как website.com/articles/World+News и проходит все, что после статей/к функции поиска в контроллере Статьи , Это работало до обновления. Теперь он пропустит маршрут и перейдет на мой маршрут «не найти маршрут», если есть что-то иное, кроме буквенно-цифровых символов. Это похоже на регулярное выражение. например «Мир» и «Мир123» будут работать, но «Мир + Новости» не будет.

вещей я попытался:

  1. Изменения регулярного выражения * только чтобы увидеть, если он работает.. Оно делает.
  2. Изменение маршрута: от ключевых слов до *, чтобы узнать, работает ли оно. Оно делает.
  3. Попытка чего-то, что я знаю, не удастся, например, исключить что-либо с буквами в матче. Он не может использовать этот маршрут, как ожидалось.

Я пробирался повсюду, пробовав всевозможные комбинации регулярных выражений (те, которые я успешно провел в тесте), и просто стараюсь выяснить, почему этот маршрут будет соответствовать, но я не могу. Это было отлично до обновления, и я не могу найти что-либо в документации CakePHP, которая подсказывает, почему это не работает. Насколько я знаю, выражения были правильными, и я подтвердил, что они полностью совпадают с использованием тестера регулярных выражений. Любая помощь будет оценена, спасибо!

+0

Я не могу решить вашу проблему, потому что я не знаком с CakePHP, но могу сказать вам две вещи. Во-первых, это почти не ваш шаблон регулярного выражения, это проблема. Если CakePHP использует очень странный двигатель регулярных выражений, этот шаблон должен полностью соответствовать «World + News». Во-вторых, ваше регулярное выражение может быть сокращено совсем немного до '[\ w +] +'. '\ W' - это набор символов, обозначающий все цифры, буквы и символ подчеркивания. Кроме того, '+' рассматривается как литерал, когда он появляется в квадратных скобках. – CAustin

+0

Спасибо за помощь. Да, мы пробовали такую ​​комбинацию (которая работала), хотя мы оставили ее так же, как это было с тех пор, как мы знаем, что работали, и мы просто пытаемся быть осторожными. Хорошо знать, что это, вероятно, не проблема с регулярным выражением. Я надеюсь, что тот, кто знает немного больше о CakePHP, чем я смогу пролить свет на эту проблему. Спасибо за комментарий! – TheThird

ответ

0

На самом деле проблема является регулярного выражения, по крайней мере, это части проблемы.

В более ранних версиях CakePHP передавал необработанный URL-адрес в соответствующий объект, что, однако, было довольно проблематичным, так как это могло потребовать очень уродливых регулярных выражений, особенно для символов, отличных от ASCII. Теперь URL декодируется вариант передается:

https://github.com/cakephp/.../commit/d5283af818b59c5d96355d6e42bbd77e1322d8cb

Так с + имеет особое значение в кодировке URL и на самом деле обозначает пробел, ваше регулярное выражение не будет соответствовать больше. Это довольно легко исправить, просто сопоставьте пробел вместо +.

+0

Это была именно эта проблема, и она исправила это. Большое спасибо! – TheThird

Смежные вопросы