Ответ 1
попробуйте эту функцию вместо этого... http://php.net/manual/en/function.mb-ereg-replace.php
у нас есть этот код:
$value = preg_replace("/[^\w]/", '', $value);
где $value
находится в utf-8. После этого преобразования первый байт многобайтовых символов лишается. Как сделать \w полностью покрывать символы UTF-8?
Извините, я не очень хорошо разбираюсь в PHP
попробуйте эту функцию вместо этого... 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
в 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 - поэтому использование этих функций - неправильный путь.
Используйте [^\w]+
вместо [^\w]
Вы также можете использовать \W
вместо [^\w]