如何在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);