使用正则表达式方法:
$regex = <<<'END'/ ( (?: [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/xEND;preg_replace($regex, '', $text);
它搜索UTF-8序列,并将其捕获到组1中。它还与无法标识为UTF-8序列的一部分的单个字节匹配,但不捕获这些字节。替换是捕获到组1中的任何内容。这将有效删除所有无效字节。
通过将无效字节编码为UTF-8字符,可以修复字符串。但是,如果错误是随机的,则可能会留下一些奇怪的符号。
$regex = <<<'END'/ ( (?: [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/xEND;function utf8replacer($captures) { if ($captures[1] != "") { // Valid byte sequence. Return unmodified. return $captures[1]; } elseif ($captures[2] != "") { // Invalid byte of the form 10xxxxxx. // Enpre as 11000010 10xxxxxx. return "xC2".$captures[2]; } else { // Invalid byte of the form 11xxxxxx. // Enpre 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字符序列。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)