3

それで、私は正規表現をいじっていました。私の友人は、文字列内のすべての 16 進数を置き換えるスクリプトを書くように私に挑戦しました。彼は、さまざまな文字と、もちろんいくつかの 16 進文字列が混在した大きなファイルを私にくれました。

16 進数の各出現箇所の前には が付きます。\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);
4

2 に答える 2

5
<?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);

参考までに、preg_replace_callback\wまた、実際には に翻訳されているため、使用しないでください[a-zA-Z0-9_]。16 進数は 16 進数なので、必要です[a-fA-F0-9](iフラグによって大文字と小文字が区別されません)。

作業例からファイル部分を除いたもの。

于 2012-04-23T20:41:59.937 に答える
2

問題は、PHP文字列のバックスラッシュをエスケープしていないことです。次のようにする必要があります。

$pattern = "/\\\\x(\\w{2})/";

...また:

$pattern = '/\\x(\w{2})/';

...一重引用符付き。 -これは実際には同じ問題を抱えており、完全なダブルエスケープシーケンスが必要です

ただし\w、16進文字だけでなく、任意のPerl単語文字と一致します。[a-fA-F0-9]代わりに文字クラスを使用します。

于 2012-04-23T20:38:44.537 に答える