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');
будет работать так, как вы хотите (замените недопустимые символы пробелами), но, похоже, не работает, если вы хотите заменить недопустимые символы чем-то другим, например ?
.
iconv не работал в моем случае (как и другие решения), поэтому я нашел свой здесь, в части "проверка символов":
Если вы столкнулись с проклятой ошибкой "недопустимый символ" при использовании 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 );