如何在PHP中使用正则表达式替换所有十六进制?
所以我一直在玩弄正则表达式,我的朋友挑战我写一个脚本来替换字符串中的所有十六进制。他给了我一个混合了不同字符的大文件,当然还有一些十六进制字符串 每次出现十六进制之前都有如何在PHP中使用正则表达式替换所有十六进制?,php,regex,hex,Php,Regex,Hex,所以我一直在玩弄正则表达式,我的朋友挑战我写一个脚本来替换字符串中的所有十六进制。他给了我一个混合了不同字符的大文件,当然还有一些十六进制字符串 每次出现十六进制之前都有\x,例如:\x55 我认为这很容易,所以我在一些在线正则表达式测试仪上试用了这种模式:/\\x([a-fA-F0-9]{2})/ 它工作得很好 然而,当我把它放到一些PHP代码中时,它根本无法替换它 有谁能给我一个正确的方向,我错了吗 这是我的密码: $toDecode = file_get_contents('hex.txt
\x
,例如:\x55
我认为这很容易,所以我在一些在线正则表达式测试仪上试用了这种模式:/\\x([a-fA-F0-9]{2})/
它工作得很好
然而,当我把它放到一些PHP代码中时,它根本无法替换它
有谁能给我一个正确的方向,我错了吗
这是我的密码:
$toDecode = file_get_contents('hex.txt');
$pattern = "/\\x(\w{2})/";
$replacement = 'OK!';
$decoded = preg_replace($pattern, $replacement, $toDecode);
$fh = fopen('haha.txt', 'w');
fwrite($fh, $decoded);
fclose($fh);
您的问题是,您没有在PHP字符串中跳过反斜杠。它需要:
$pattern = "/\\\\x(\\w{2})/";
…或:
…单引号。
-这实际上遇到了同样的问题,需要完整的双转义序列
但是
\w
将匹配任何perl word字符,而不仅仅是十六进制字符。我会使用字符类[a-fA-F0-9]
。你能提供你的文件hex.txt
的一小部分吗?真正的十六进制只包括字符0-9
和a-F
,而你的正则表达式将匹配除此之外的字符。祝你好运,尼克。我会马上改变它。你可以提高你的识别能力-\w
是任何字母或数字,但十六进制只有0-9和a-F。你可以用[0-9a-fA-F]替换它,而不是preg\u replace($pattern,chr(hexdec($1)),$toDecode)
有同样的效果吗?@Rob:虽然我有(即使在使用e
标志时)我也是。很奇怪。你的确实有效,但现在我想知道为什么我上面的例子不起作用。是时候玩弄它了。谢谢你的帮助!所有这些逃跑让我头疼,但这确实是问题所在。谢谢
<?php
// grab the encoded file
$toDecode = file_get_contents('hex.txt');
// create a method to convert \x?? to it's character facsimile
function escapedHexToHex($escaped)
{
// return 'OK!'; // what you're doing now
return chr(hexdec($escaped[1]));
}
// use preg_replace_callback and hand-off the hex code for re-translation
$decoded = preg_replace_callback('/\\\\x([a-f0-9]{2})/i','escapedHexToHex', $toDecode);
// save result(s) back to a file
file_put_contents('haha.txt', $decoded);
<?php
// grab the encoded file
$toDecode = file_get_contents('hex.txt');
// create a method to convert \x?? to it's character facsimile
function escapedHexToHex($escaped)
{
// return 'OK!'; // what you're doing now
return chr(hexdec($escaped[1]));
}
// use preg_replace_callback and hand-off the hex code for re-translation
$decoded = preg_replace_callback('/\\\\x([a-f0-9]{2})/i','escapedHexToHex', $toDecode);
// save result(s) back to a file
file_put_contents('haha.txt', $decoded);