PHP:替换utf-8字符串中的无效字符

时间:2009-09-16 15:15:34

标签: php regex utf-8

如何在空白字符的utf-8字符串中替换(在PHP5中使用正则表达式)无效字符?

4 个答案:

答案 0 :(得分:22)

使用iconv

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

请参阅manual

干杯

答案 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不适合我的情况(作为其他解决方案)所以我在这里找到了我的“角色验证”部分:

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

答案 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 );