2011-09-21 69 views
1

在php中,我需要替換字符串中的所有非UTF8字符。但是,不是通過某些等效(如iconv功能與//TRANSLIT),而是通過某些選定的字符(例如"_""*")。替換非UTF8字符

通常我希望用戶能夠看到無效字符被發現的位置。

我沒有發現這樣做的任何功能,所以我打算用:

  • 使用iconv//IGNORE
  • 做兩個字符串一個diff和插入要的字符,其中非-UTF8其中

您是否看到了更好的方式來做到這一點,是否有一些功能在PHP中可以結合起來有這種行爲?

感謝您的幫助。

回答

3

這裏有兩個功能,幫助用戶實現了接近你想要什麼:

//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); 

請注意,您可以通過改變位於preg_replace('blablabla', **'?'**, $some_string)串更換替換(目前是與別的「?」

原來的文章:http://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/

+0

聽起來不錯,我會測試它。 –