PHP: заменить недопустимые символы в строке utf-8 в

Как заменить (использовать регулярное выражение в PHP5) недопустимые символы в строке utf-8 на символы пробела?

4 ответов


использовать функцию iconv

$text = iconv("UTF-8", "UTF-8//IGNORE", $text);

посмотреть руководство.

Ура


С работы mbstring вы можете сделать:

$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');

будет работать так, как вы хотите (замените недопустимые символы пробелами), но, похоже, не работает, если вы хотите заменить недопустимые символы чем-то другим, например ?.

посмотреть: замена недопустимых символов UTF-8 вопросительными знаками, mbstring.substitute_character, кажется, игнорируется


iconv не работал в моем случае (как и другие решения), поэтому я нашел свой здесь, в части "проверка символов":

http://webcollab.sourceforge.net/unicode.html


Если вы столкнулись с проклятой ошибкой "недопустимый символ" при использовании XML PHP или парсера JSON, то вы можете быть заинтересованы в этом.

к сожалению, синтаксические анализаторы PHP XML и JSON не игнорируют символы, отличные от UTF8, а скорее останавливаются и выдают довольно бесполезную ошибку. Я нашел ниже код формы net и отлично работать для меня..

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
 '|[\x00-\x7F][\x80-\xBF]+'.
 '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
 '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
 '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
 '?', $some_string );

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
 '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );