我正在编写一个简单的工具,用它的 ascii 等效项替换字符串中的所有十六进制。
我可以用正则表达式替换内容;但是,当尝试在十六进制上运行 pack 时,它不会将其转换为 char
$str = '${\\"GL\\x47\\x4c\\x4c\\x53\\"}';
$re = '/(\\\\x[0-9a-fA-F]+)/m';
$str = preg_replace_callback('/(\\\\x[0-9a-fA-F]+)/m', function($matches){
foreach($matches as $match){
return pack("H*",bin2hex($match));}
}, $str);
print_r($str);
你为什么使用
bin2hex
?我只需从十六进制表示中删除 \x 并使用新删除的十六进制字符串作为包参数:
<?php
$str = '${\\"GL\\x47\\x4c\\x4c\\x53\\"}';
$re = '/(\\\\x[0-9a-fA-F]+)/m';
$str = preg_replace_callback('/(\\\\x[0-9a-fA-F]+)/m', function($matches){
foreach($matches as $match){
$match = preg_replace("/\\\\x/","",$match);
return pack("H*",$match);
}
}, $str);
print_r($str);
${\"GLGLLS\"}
请允许我为这个十六进制到文本转换任务提供一个简化/精致的版本。
匹配完整的十六进制序列,仅捕获字母数字子字符串(如
$m[1]
),然后将完整字符串匹配替换为pack('H*', $m[1])
的返回值。
代码:(演示)
$str = '${\\"GL\\x47\\x4c\\x4c\\x53\\"}';
echo preg_replace_callback(
'/\\\\x([\da-fA-F]+)/',
fn($m) => pack('H*', $m[1]),
$str
);
//output: ${\"GLGLLS\"}