\ w в PHP preg_replace охватывает только второй байт символов UTF-8

у нас есть этот код:

$value = preg_replace("/[^\w]/", '', $value);

где $value находится в utf-8. После этого преобразования первый байт многобайтовых символов лишается. Как сделать \w полностью покрывать символы UTF-8?

Извините, я не очень хорошо разбираюсь в PHP

Ответ 2

Вы можете попробовать с модификатором /u:

Этот модификатор включает дополнительные функции PCRE, которые несовместимы с Perl. Строки шаблонов рассматриваются как UTF-8. Этот модификатор доступен с PHP 4.1.0 или выше в Unix и с PHP 4.2.3 на win32. Срок действия шаблона UTF-8 проверяется с PHP 4.3.5.

Если этого не произойдет, попробуйте

  • mb_ereg_replace - Заменить регулярное выражение на многобайтную поддержку

вместо.

Ответ 3

Существует этот неприятный u модификатор для pcre-шаблонов в PHP. В нем указано, что регулярное выражение закодировано в UTF8, но я обнаружил, что он обрабатывает ввод как UTF8.

Ответ 4

Добавить u в regex, чтобы включить многобайтовый режим Unicode для PCRE:

$value = preg_replace("/[^\w]/u", '', $value);

Следствие

В режиме Unicode PCRE ожидает, что все будет многобайтовым, а если нет, тогда будут проблемы с соблюдением сроков. Поэтому, чтобы преобразовать что-либо в UTF-8 (и удалить любой неконвертируемый мусор), мы сначала используем:

$value = iconv( 'ISO-8859-1', 'UTF-8//IGNORE//TRANSLIT', $i );

для очистки и подготовки ввода.

Поскольку все может быть закодировано в ISO-8859-1 (даже если некоторые неясные символы появляются некорректно), и поскольку большинство веб-браузеров запускаются изначально в 8859 (если не сказано использовать UTF-8), мы обнаружили эту функцию как общий, безопасный, эффективный метод "взять что-нибудь, сбросить все мусор и преобразовать в UTF-8".

mb_ereg_ * устарел с 5.3.0 - поэтому использование этих функций - неправильный путь.

Ответ 5

Используйте [^\w]+ вместо [^\w]

Вы также можете использовать \W вместо [^\w]