php过滤非utf8字符,从字符串中删除非UTF8字符

该博客介绍了如何使用正则表达式来检测并修复UTF-8编码错误。通过匹配有效的UTF-8字节序列并替换无效字节,可以有效地清理字符串。文中提供了一个函数`utf8replacer`,用于处理捕获到的有效和无效字节,确保字符串的正确编码。

小编典典

使用正则表达式方法:

$regex = <<

/

(

(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx

| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx

| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2

| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3

){1,100} # ...one or more times

)

| . # anything else

/x

END;

preg_replace($regex, '$1', $text);

它搜索UTF-8序列,并将其捕获到组1中。它还与无法标识为UTF-8序列的一部分的单个字节匹配,但不捕获这些字节。替换是捕获到组1中的任何内容。这将有效删除所有无效字节。

通过将无效字节编码为UTF-8字符,可以修复字符串。但是,如果错误是随机的,则可能会留下一些奇怪的符号。

$regex = <<

/

(

(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx

| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx

| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2

| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3

){1,100} # ...one or more times

)

| ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111

| ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111

/x

END;

function utf8replacer($captures) {

if ($captures[1] != "") {

// Valid byte sequence. Return unmodified.

return $captures[1];

}

elseif ($captures[2] != "") {

// Invalid byte of the form 10xxxxxx.

// Encode as 11000010 10xxxxxx.

return "\xC2".$captures[2];

}

else {

// Invalid byte of the form 11xxxxxx.

// Encode as 11000011 10xxxxxx.

return "\xC3".chr(ord($captures[3])-64);

}

}

preg_replace_callback($regex, "utf8replacer", $text);

编辑:

!empty(x)将匹配非空值("0"被视为空)。

x != ""将匹配非空值,包括"0"。

x !== ""将匹配除以外的任何内容""。

x != "" 在这种情况下似乎是最好的选择。

我也加快了比赛速度。而不是单独匹配每个字符,它匹配有效的UTF-8字符序列。

2020-05-26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值