\w в PHP preg_replace покрывает только второй байт символов UTF-8
У нас есть этот код:
$value = preg_replace("/[^\w]/", '', $value);
где $value
находится в utf-8. После этого преобразования первый байт многобайтовых символов удаляется. Как заставить \w полностью покрыть символы UTF-8?
Извините, я не очень хорошо разбираюсь в PHP
5 ответов
Попробуйте эту функцию вместо... http://php.net/manual/en/function.mb-ereg-replace.php
Вы можете попробовать с модификатором /u:
Этот модификатор включает дополнительные функции PCRE, несовместимые с Perl. Строки шаблона рассматриваются как UTF-8. Этот модификатор доступен из PHP 4.1.0 или выше в Unix и из PHP 4.2.3 в win32. UTF-8 валидность шаблона проверяется начиная с PHP 4.3.5.
Если это не сработает, попробуйте
mb_ereg_replace
- Заменить регулярное выражение многобайтовой поддержкой
вместо.
Есть эта мерзость u
модификатор для шаблонов pcre в PHP. В нем говорится, что регулярное выражение закодировано в UTF8, но я обнаружил, что оно также обрабатывает ввод как UTF8.
Присоединять u
для регулярного выражения, чтобы включить многобайтовый 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".
Начиная с версии 5.3.0, mb_ereg_ * устарела, поэтому использование этих функций - неправильный путь.
Использование [^\w]+
вместо [^\w]
Вы также можете использовать \W
на месте [^\w]