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

8

如何使用PHP5中的正则表达式替换UTF-8字符串中的无效字符为空格字符?


1
你想做什么?去除空格还是 utf-8 字符?给一个例子。 - Quinn Wilson
4
去除 UTF-8 字符很容易:$text = ''; :-) - Joey
4个回答

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

看看手册
祝好。

7
对我来说这个方法不起作用,无效的字符仍然存在。就像对bobef也没用一样,它不能完成任务。 - Rodniko
这对我有用。源文件是SBA特许经营代码的下载CSV文件,我手动将其格式化为JSON以在Laravel种子中使用。但是,即使我的格式化文件通过了JSON验证,文件中仍然存在PHP无法解码的隐藏的无效UTF-8字符。 - Ixalmida
我还没有深入调试细节,但iconv和mb_convert都不能解决json_encode()的问题。它可能在许多情况下有所帮助,但并非所有情况都适用。 - John

8

3

如果你在使用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 );

无法解决json_encode的问题。 它会将一些有效的UTF8报告为无效,但遗憾的是没有给出任何提示是什么问题。 - John

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接