2009-09-16 100 views
8

如何在空白字符中替換(在PHP5中使用正則表達式)utf-8字符串中的無效字符?PHP:替換utf-8字符串中的無效字符

+1

那你想幹什麼?擺脫空白?或utf-8字符? 舉個例子。 – 2009-09-16 15:19:59

+3

擺脫UTF-8字符很簡單:'$ text ='';':-) – Joey 2009-09-16 15:26:08

回答

22

使用的iconv

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

看到manual

乾杯

+7

這對我來說不起作用。無效字符停留。就像它不適用於bobef。它只是不做這項工作。 – Rodniko 2013-04-10 14:06:43

+0

這對我有用。源文件下載了SBA特許經營代碼的CSV格式,我手動格式化爲JSON以用於Laravel播種機。但即使我的格式化文件通過了JSON驗證,仍然存在PHP無法解碼的文件中隱藏的無效UTF-8字符。 – Ixalmida 2017-06-12 21:01:07

+0

我還沒有調試到細節,但iconv以及mb_convert不解決問題與json_encode() 它可能有助於在許多情況下,而不是。 – John 2018-01-13 07:21:35

1

如果您所遇到的詛咒「無效字符」錯誤而使用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); 
+0

不能解決json_encode的問題。 它報告一些有效的UTF8也是無效的,遺憾的是沒有給出線索是什麼問題。 – John 2018-01-13 07:32:42