服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

PHP过滤掉非utf8字符

时间:2016-06-29 20:24来源:未知 作者:最模板 点击:
,在网上找到好多的过滤utf8的方法,都没有成功。只能靠自己来实现 PHP过滤非UTF8字符。 一、思想 1、先将utf8的字符替换为英文逗号。 2、通过英文逗号分隔为数组。 3、过滤出来特殊

,在网上找到好多的过滤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编辑器才能看到。

(责任编辑:最模板)
顶一下
(0)
0%
踩一下
(2)
100%
------分隔线----------------------------
栏目列表
热点内容