如何在空白字符的utf-8字符串中替换(在PHP5中使用正则表达式)无效字符?
答案 0 :(得分:22)
答案 1 :(得分:6)
使用 mbstring ,您可以执行以下操作:
$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');
将按您的意愿工作(用空格替换无效字符),但如果您想用其他内容替换无效字符(例如?
),则似乎无效。
请参阅:Replacing invalid UTF-8 characters by question marks, mbstring.substitute_character seems ignored
答案 2 :(得分:3)
iconv不适合我的情况(作为其他解决方案)所以我在这里找到了我的“角色验证”部分:
答案 3 :(得分:2)
如果您在使用PHP的XML或JSON解析器时遇到了被诅咒的“无效字符”错误,那么您可能对此感兴趣。
不幸的是,PHP的XML和JSON解析器不会忽略非UTF8字符,而是停止并抛出一个相当无用的错误。我找到了下面的代码表格,对我来说非常好..
//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 );