如何匹配字符的十六进制序列并将其替换为 PHP 中的白色 space

How to match a hex sequence of characters and replace it with white space in PHP

我有一段文字需要清理一些字符。这些字符显示在我附加到问题的图片中。我想用白色替换它们 space x20.

我的尝试是使用 preg_replace.

$result = preg_replace("/[\xef\x82\xac\x09|\xef\x81\xa1\x09]/", "\x20", $string);

对于特定情况,这种方法有效,但在某些情况下它不会,因为例如我有一个带逗号的文本并且它匹配 x82 并将其从该文本中删除。

我如何编写我的正则表达式来精确搜索此序列 ef 82 ac 09 或另一个 ef 81 a1 09,而不是像 ef 82 那样分别搜索每一对 ac 09?

1.) 你匹配字符class中的6个不同的十六进制字节或管道字符中的任何一个。可能想使用一组 (?:...|...) 来匹配不同的字节序列。

2.) 字节序列与图像不匹配。好像你搞砸了两个字节。图片显示:ef 82 a1 09ef 81 ac 09 vs 你的尝试:\xef\x82\xac\x09 | \xef\x81\xa1\x09

3.) 当testing your input sample

$str = "de la nouvelle;      Fourniture $         Option :";

foreach(preg_split("//u", $str) AS $v) {
  var_dump($v, bin2hex($v)); echo "\n";
}

事实证明,09 太多了。要删除的字符实际上是ef81acef82a1。 所以正确的正则表达式是 (?:\xef\x81\xac|\xef\x82\xa1)

$result = preg_replace("/(?:\xef\x81\xac|\xef\x82\xa1)/", "\x20", $string);

test at eval.in

如果整个文件的内容是 UTF-8 编码的文本,那么您可能希望从 Private Use Area 中删除字符,因为 \xef\x82\xac 解码为代码点 U+F0AC 和 \xef\x81\xa1解码为代码点U+F061,属于私有使用区U+E000..U+F8FF.

$result = preg_replace("~\p{Co}~u", " ", $input);

\p{Co}是Unicode中所有属于Other, Private Use类别的字符class,包括U+E000..U+F8FF,U+这3个范围内的所有字符F0000..U+FFFFD, U+100000..U+10FFFD.