如何匹配字符的十六进制序列并将其替换为 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 09
和 ef 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
太多了。要删除的字符实际上是ef81ac
和ef82a1
。
所以正确的正则表达式是 (?:\xef\x81\xac|\xef\x82\xa1)
$result = preg_replace("/(?:\xef\x81\xac|\xef\x82\xa1)/", "\x20", $string);
如果整个文件的内容是 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.
我有一段文字需要清理一些字符。这些字符显示在我附加到问题的图片中。我想用白色替换它们 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 09
和 ef 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
太多了。要删除的字符实际上是ef81ac
和ef82a1
。
所以正确的正则表达式是 (?:\xef\x81\xac|\xef\x82\xa1)
$result = preg_replace("/(?:\xef\x81\xac|\xef\x82\xa1)/", "\x20", $string);
如果整个文件的内容是 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.