如何在PHP中匹配十六进制字符序列并将其替换为空格

如何在PHP中匹配十六进制字符序列并将其替换为空格,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个文本,我需要清理一些字符。这些字符显示在我附加到问题的图片中。我想将它们替换为空白x20 我的尝试是使用preg\u replace $result = preg_replace("/[\xef\x82\xac\x09|\xef\x81\xa1\x09]/", "\x20", $string); 对于特定的情况,这种方法有效,但对于某些情况,它不会,因为例如,我有一个带有逗号的文本,它匹配了x82,并将其从该文本中删除 我如何编写我的正则表达式来精确搜索这个序列ef 82 ac 0

我有一个文本,我需要清理一些字符。这些字符显示在我附加到问题的图片中。我想将它们替换为空白
x20

我的尝试是使用
preg\u 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]那样分别搜索每一对。可能想使用组
(?:
|
来匹配不同的字节序列

2.)此外,字节序列与图像不匹配。好像你弄乱了两个字节。图片显示:
ef 82 a1 09
ef 81 ac 09
与您的尝试相比:
\xef\x82\xac\x09
\xef\x81\xa1\x09

3)什么时候

结果证明,
09
太多了。要删除的字符实际上是
ef81ac
ef82a1
。 因此,正确的正则表达式应该是
(?:\xef\x81\xac |\xef\x82\xa1)


请参见

如果整个文件的内容是UTF-8编码的文本,则您可能希望从中删除字符,因为
\xef\x82\xac
解码到代码点U+F0AC和
\xef\x81\xa1
解码到代码点U+F061,它们属于专用区域U+E000..U+F8FF

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

\p{Co}
是Unicode中属于其他专用类别的所有字符的字符类,包括3个范围U+E000..U+F8FF、U+F0000..U+FFFFD中的所有字符,U+100000..U+10FFFD.

@anubhava图片中有字符串。您尝试过使用类似于
str\U replace
的简单方法吗?正如我所建议的,使用
var\U dump
而不是图片需要输入的示例文本。很好,您成功了!:]刚刚使用。@Jonny5请将您的解决方案作为答案发布,以便我们可以在解决问题后关闭此问题。谢谢
$result = preg_replace("/(?:\xef\x81\xac|\xef\x82\xa1)/", "\x20", $string);
$result = preg_replace("~\p{Co}~u", " ", $input);