PCRE: различное поведение для \ w на разных серверах - PullRequest
0 голосов
/ 04 декабря 2010

Я использую систему маршрутизации Kohana для своего собственного приложения, и при определении шаблона pcre для тега URL мой localhost ведет себя не так, как рабочий сервер.

У меня есть этот маршрут:

Route::set( 'list', 'list(/tagged/<tags>)',
            array('tags'=>'[\w\d\-\+]+') );

Раньше это работало нормально до того дня, когда кто-то использовал тег, который не содержал «стандартных» символов (-). На моем локальном хосте проблем нет, но на производственном сервере система не может найти маршрут.

В рабочем коде мне нужно изменить шаблон и явно добавить 'ñ' к разрешенным символам!

'\pL[\w\d\-\+ñ]+'

Вопрос в том, почему? Хорошо, теперь это работает, когда я добавил 'ñ', но рано или поздно он снова потерпит неудачу!

Ответы [ 2 ]

3 голосов
/ 04 декабря 2010

Посмотрите на различные классы символов Unicode, которые вы можете использовать здесь: http://www.regular -expressions.info / unicode.html # prop Сказав это, вы сможете использовать что-то вроде этого:

Route::set('list', 'list(/tagged/<tags>)', array('tags'=>'[\p{L}\p{N}\-\+]+'));
  1. \p{L} любое письмо на любом языке.
  2. \p{N} любой вид числового символа в любом скрипте.

Я проверял это на ideone.com. Посмотреть пример .

3 голосов
/ 04 декабря 2010

Поскольку значение \w зависит от локали, ваш производственный сервер, вероятно, имеет чистый языковой стандарт C, тогда как ваша система разработки включает расширенные коды символов.

IIRC с использованием модификатора /u unicode позволяет1005 * для соответствия всем буквенным символам.Если Kohana не позволяет указывать модификаторы, добавьте его в строку с (?u)[...].Или, может быть, в вашем случае вам нужно всего лишь повторить \p{L} в квадратных скобках:

'\pL[\w\d\-\+\p{L}]+'
...