Проблема заключается в следующем:
Использование модификатора шаблона / u предотвращает
слова изуродованы, но вместо
PCRE пропускает строки символов с
кодовые значения больше 127.
Следовательно, \ w не будет соответствовать
многобайтовое (не нижнее ascii) слово в
все (но также не вернут части
Это). Со страницы руководства pcrepattern;
В режиме UTF-8 символы со значениями
больше 128 никогда не совпадают \ d, \ s,
или \ w, и всегда совпадают с \ D, \ S и
\ W. Это верно даже тогда, когда Unicode
поддержка свойств персонажа
имеется.
С Обработка UTF-8 с PHP .
Поэтому это на самом деле не имеет значения, если ваш URL-адрес закодирован в формате ISO-8859-1 (mysite.local / citytest / M% FCnchen) или в кодировке UTF-8 (mysite.local / citytest / M% C3% BCnchen), регулярное выражение по умолчанию не будет матч.
Я также провел эксперименты с умлаутами в URL в Zend Framework и пришел к выводу, что вам не нужны умлауты в ваших URL. Проблема в том, что вы не можете полагаться на кодировку, используемую браузером для URL. Например, Firefox (до версии 3.0) не кодирует UTF-8 URL-адреса, введенные в текстовое поле адреса (если не указано в about: config), и IE имеет флажок в своих опциях для выбора между обычной и кодировкой UTF-8 для своих URL-адресов. , Но если вы нажимаете на ссылки на странице, оба браузера используют URL в заданной кодировке (UTF-8 на странице UTF-8). Поэтому вы не можете быть уверены, в какой кодировке URL-адреса отправляются вашему приложению - и обнаружение используемой кодировки не так просто.
Возможно, лучше использовать транслитерированные параметры в ваших URL (например, изменить Ä на Ae и т. Д.). Существует очень простой способ (я не знаю, работает ли это на всех языках, но я использую его с немецкими строками, и он работает довольно хорошо):
function createUrlFriendlyName($name) // $name must be an UTF-8 encoded string
{
$name=mb_convert_encoding(trim($name), 'HTML-ENTITIES', 'UTF-8');
$name=preg_replace(
array('/ß/', '/&(..)lig;/', '/&([aouAOU])uml;/', '/&(.)[^;]*;/', '/\W/'),
array('ss', '$1', '$1e', '$1', '-'),
$name);
$name=preg_replace('/-{2,}/', '-', $name);
return trim($name, '-');
}