Home  >  Article  >  Backend Development  >  How to delete non-utf8 characters in php

How to delete non-utf8 characters in php

藏色散人
藏色散人Original
2021-06-11 10:56:432510browse

php删除非utf8字符的方法:首先创建一个PHP示例文件;然后使用正则表达式“preg_replace($regex, '$1', $text);”方法删除非utf8字符即可。

How to delete non-utf8 characters in php

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

具体问题:

php怎么删除非utf8字符?

php 从字符串中删除非UTF8字符

我在从字符串中删除非utf8字符时出现问题,这些字符无法正确显示。像这样的字符0x97 0x61 0x6C 0x6F(十六进制表示)

删除它们的最佳方法是什么?正则表达式还是其他?

 

解决办法:

使用正则表达式方法:

$regex = <<<&#39;END&#39;
/
  (
    (?: [\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, &#39;$1&#39;, $text);

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

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

$regex = <<<&#39;END&#39;
/
  (
    (?: [\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字符序列。

推荐学习:《PHP视频教程

The above is the detailed content of How to delete non-utf8 characters in php. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn