この正規表現がこの行と一致しない理由を理解しようとしていますが、これ以上のアイデアはありません。
(?:([a-zA-Z0-9]{2})\s\s)+
53 65 72 76 65 72 3a 20 41 70 61 63 68 65 00 45
しかし、これはすべての16進バイトをキャッチするわけではありません...
UPD: preg_match$resultsにすべてのバイトをキャッチする必要があります
それらがタブではなく2つのスペースであることをどうやって知っていますか?この正規表現を試してください:
/^(?:([a-f0-9]{2})\s*)+$/i
ベース36ではなく、16進数のみに一致するように絞り込んだことに注意してください。また、文字列の最後にスペースを探していたため、正規表現が一致していなかった可能性があります。
質問に貼り付けた行が正確に一致している行であると仮定すると、その正規表現はその行と一致します。
<?php
$hex = "53 65 72 76 65 72 3a 20 41 70 61 63 68 65 00 45 ";
preg_match('/(?:([a-zA-Z0-9]{2})\s\s)+/', $hex, $matches);
var_dump($matches);
出力:
array(2) {
[0]=>
string(64) "53 65 72 76 65 72 3a 20 41 70 61 63 68 65 00 45 "
[1]=>
string(2) "45"
}
ただし、おそらくあなたがやろうとしているのは、個々の16進バイトの配列を取得することです。したがって、その正規表現で上記と同様のコードを使用している場合は、間違っています。代わりに、次のようになります。
preg_match_all('/([a-zA-Z0-9]{2})\s{2}/', $hex, $matches);
// $matches[1] will be your array of hex bytes
理由はいくつかありますが、これが入力と一致しない理由です。行が2つのスペースで終わっているかどうか、および各番号の間に実際に2つの空白文字があるかどうかを確認してください。また、入力に文字コード160(ノーブレークスペース)が含まれているかどうかも確認してください。私の知る限り、PCREはこれを\sとして認識しません。