PHP过滤掉非utf8字符

开发生成XML的时候,发现里面有一些特殊字符,比如  ,在网上找到好多的过滤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编辑器才能看到。

PHP过滤掉非utf8字符》上有2条评论

  1. Pingback引用通告: PHP过滤掉非utf8字符 – 码农小站

发表评论

电子邮件地址不会被公开。