\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]

Другие вопросы по тегам