2009-09-16 17 views
8

¿Cómo reemplazar (usar expresiones regulares en PHP5) caracteres no válidos en cadena utf-8 en caracteres de espacios en blanco?PHP: reemplazar caracteres no válidos en cadena utf-8 en

+1

¿Qué desea hacer? deshacerse del espacio en blanco? o caracteres utf-8? Da un ejemplo. –

+3

deshacerse de los caracteres UTF-8 es fácil: '$ text = '';' :-) – Joey

Respuesta

22

uso iconv

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

ver la manual.

Saludos

+7

Esto no funcionó para mí. personajes inválidos se quedaron. al igual que no funcionó para bobef. simplemente no hace el trabajo. – Rodniko

+0

Esto funcionó para mí. El archivo fuente fue descargado CSV de los códigos de franquicia de SBA, que formateé manualmente en JSON para ser utilizado en una sembradora Laravel. Pero a pesar de que mi archivo formateado pasó la validación de JSON, todavía había caracteres UTF-8 ocultos y no válidos en el archivo que PHP no pudo decodificar. – Ixalmida

+0

Todavía no me he depurado de los detalles, pero iconv y mb_convert no resuelven el problema con json_encode() Podría ayudar en muchos casos, no en todos. – John

1

Si ha encontrado el error maldito ‘carácter no válido’, mientras que el uso de XML de PHP o analizador JSON entonces usted podría estar interesado en esto.

Desafortunadamente, los analizadores XML y JSON de PHP no ignoran los caracteres que no son UTF8, sino que se detienen y arrojan un error bastante inútil. Encontré el siguiente código en forma de red y funciona excelentemente para mí ..

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

no resuelve el problema con json_encode. informa que algunos UTF8 válidos tampoco son válidos, lamentablemente sin dar una pista de qué se trata. – John

Cuestiones relacionadas