如何匹配十六进制字符序列并用PHP中的空格替换它

时间:2015-07-23 15:06:01

标签: php regex preg-replace

我有一个文字,我需要清理一些字符。这个字符显示在我附在问题上的图片中。我想用空格x20替换它们。

First hex sequence

Second hex sequence

我的尝试是使用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 {{1 }} ac

2 个答案:

答案 0 :(得分:0)

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

2.)字节序列也与图像不匹配。好像你搞砸了两个字节。图为ef 82 a1 09ef 81 ac 09与您的尝试:\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

答案 1 :(得分:0)

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

\xef\x81\xa1

$result = preg_replace("~\p{Co}~u", " ", $input); 是所有字符的字符类,属于Unicode中的其他私有使用类别,其中包括3个范围内的所有字符U + E000..U + F8FF,U + F0000..U + FFFFD ,U + 100000..U + 10FFFD。