,在网上找到好多的过滤utf8的方法,都没有成功。只能靠自己来实现 PHP过滤非UTF8字符。 一、思想1、先将utf8的字符替换为英文逗号。 2、通过英文逗号分隔为数组。 3、过滤出来特殊字符。 4、str_replace 查找替换特殊字符。 二、具体代码error_reporting(E_ALL); header("Content-type: text/html; charset=utf-8"); function filterUtf8($string) { if($string) { //先把正常的utf8替换成英文逗号 $result = preg_replace('%( [\x09\x0A\x0D\x20-\x7E] | [\xC2-\xDF][\x80-\xBF] | \xE0[\xA0-\xBF][\x80-\xBF] | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | \xF0[\x90-\xBF][\x80-\xBF]{2} | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )%xs',',',$string); //转成字符数字 $charArr = explode(',', $result); //过滤空值、重复值以及重新索引排序 $findArr = array_values(array_flip(array_flip(array_filter($charArr)))); return $findArr ? str_replace($findArr, "", $string) : $string; } return $string; } function is_utf8($string) { return preg_match('%^(?: [\x09\x0A\x0D\x20-\x7E] | [\xC2-\xDF][\x80-\xBF] | \xE0[\xA0-\xBF][\x80-\xBF] | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | \xF0[\x90-\xBF][\x80-\xBF]{2} | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )*$%xs', $string); } $string = <<<EOF 您好!XML中有特殊字符 EOF; echo $string = is_utf8($string) ? $string : filterUtf8($string); 三、总结1、网上有过滤非法utf8字符的,但是限于三个字节的。通过strlen函数,发现图中的字符长度为1。 2、这种字符在火狐浏览器下和sublime编辑器才能看到。 (责任编辑:最模板) |