php过滤4字节的字符串,PHP过滤掉非utf8字符

开发生成XML的时候,发现里面有一些特殊字符,比如

1614e9fd71b172cf99bca249a91a8a67.png,在网上找到好多的过滤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 = <<

您好!XML中有特殊字符

EOF;

echo $string = is_utf8($string) ? $string : filterUtf8($string);

三、总结

1、网上有过滤非法utf8字符的,但是限于三个字节的。通过strlen函数,发现图中的字符长度为1。

2、这种字符在火狐浏览器下和sublime编辑器才能看到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值