我有一个文字,我需要清理一些字符。这个字符显示在我附在问题上的图片中。我想用空格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
{{1 }} ac
?
答案 0 :(得分:0)
1。)您匹配字符类中的6个不同的十六进制字节或管道字符中的任何一个。可能想要使用组(?:
... |
... )
来匹配不同的字节序列。
2.)字节序列也与图像不匹配。好像你搞砸了两个字节。图为ef 82 a1 09
和ef 81 ac 09
与您的尝试:\xef\x82\xac\x09
| \xef\x81\xa1\x09
$str = "de la nouvelle; Fourniture $ Option :";
foreach(preg_split("//u", $str) AS $v) {
var_dump($v, bin2hex($v)); echo "\n";
}
事实证明,09
太过分了。要删除的字符实际上是ef81ac
和ef82a1
。
所以正确的正则表达式是(?:\xef\x81\xac|\xef\x82\xa1)
$result = preg_replace("/(?:\xef\x81\xac|\xef\x82\xa1)/", "\x20", $string);
答案 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。