Ключ /u работает так, как и должен работать. Если вы ожидаете что он будет работать как-то по другому — обоснуйте. В документации объясняется почему \w для Unicode смысла не имеет, например. Вы можете использовать \p{L} или (рекомендуемый консорциумом) когломерат (?:\p{L}|\p{M}|\p{D}|\p{Pc}) или ещё чего — это от вашей фантазии зависит…
Я подразумевал, что логичнее было бы в режиме /u рассматривать \w как любой символ буквы или цифры, по аналогии с не-юникодным режимом.
Иными словами [\w] рассматривать как [\p{L}\p{Nd}], тогда, по сути, большинство паттернов стали бы юникодными после простого добавления ключа /u. Это с точки зрения совместимости при переходе с однобайтной кодировки на UTF-8.
Но раз этого нет, то скорее всего на это есть объективные причины. Если знаете — поделитесь, в документации про ключ /u ничего не нашел (смотрел в разделе «PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE» и просто поиском по документу).
Matching characters by Unicode property is not fast, because PCRE has to search a structure that contains data for over fifteen thousand characters. That is why the traditional escape sequences such as \d and \w do not use Unicode properties in PCRE.
Всё чётко и понятно, по-моему. Конечно для PHP все эти ухищрения особого смысла не имеют (такого идиотского интерфейса к регулярным выражениям как в PHP я нигде и никогда не видел), но библиотека-то не под PHP затачивалась! Потому для быстрой работы с символами до 127 остались \w и \d (которые никогда не матчатся на символы с кодами более 127), а для всех остальных — пожалуйста, \P. Куда обиднее что нету \b нормального — его заменить на набор \p не удастся…
Пожалуй, бОльшая в разы скорость работы все же поважнее совместимости, хотя из-за этого старый проект на UTF будет проблемно переставлять, если много где используются регулярные выражения. Но что-то мне подсказывает, что там, где в однобайтном использовалось \w, кириллица и прочее должны match'иться, т.к. иначе бы использовалось [a-z0-9]…
Неоднозначность названий… Где-то надо win-1251, где-то cp1251, где-то windows-1251, а еще где-то win1251… Даже UTF-8 можно (или даже нужно) иногда писать как UTF8…
По-моему правильно — это CP1251 и UTF8|UTF16|UCS2BE и т.д. и никаких тире или пробелов, ну почему хоть это-то никак не могут стандартизовать…
Я вчера весь мозг сломал, вспоминая как правильно — UCS-2BE или UCS2-BE…
недавно перешли с 1251 на UTF-8.
Всем довольны, все прекрасно, но уже третий день наблюдаю странную вещь — часть (меньшая, к счастью) пользователей шлет данные формы в cp1251
PHP, PREG и UTF-8