通过 preg_replace_callback 将所有十六进制替换为 Ascii

问题描述 投票:0回答:2

我正在编写一个简单的工具,用它的 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);
php preg-replace-callback
2个回答
0
投票

你为什么使用

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\"}

0
投票

请允许我为这个十六进制到文本转换任务提供一个简化/精致的版本。

匹配完整的十六进制序列,仅捕获字母数字子字符串(如

$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\"}
© www.soinside.com 2019 - 2024. All rights reserved.