我试图弄清楚为什么这个正则表达式与这条线不匹配,但我没有更多的想法。
(?:([a-zA-Z0-9]{2})\s\s)+
53 65 72 76 65 72 3a 20 41 70 61 63 68 65 00 45
但这并没有捕捉到所有的十六进制字节......
UPD:我需要抓住每一口 preg_match $results
你怎么知道那是两个空格而不是一个制表符?试试这个正则表达式:
/^(?:([a-f0-9]{2})\s*)+$/i
请注意,我已将其范围缩小为仅匹配十六进制,而不是 base-36。此外,您的正则表达式可能不匹配,因为它正在寻找字符串末尾的空格。
该正则表达式确实与该行匹配,假设您粘贴到问题中的行正是您要匹配的行:
<?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"
}
但是,您最有可能尝试做的是获取单个十六进制字节的数组,因此,如果您在该正则表达式中使用与上述类似的代码,那么您做错了。它应该是这样的,而不是:
preg_match_all('/([a-zA-Z0-9]{2})\s{2}/', $hex, $matches);
// $matches[1] will be your array of hex bytes
只有几个原因,为什么这不符合您的输入。请检查该行是否以两个空格结尾,以及每个数字之间是否真的有两个空格字符。还要检查您的输入是否包含字符代码 160(牢不可破的空格),因为据我所知 PCRE 不会将其识别为 \s。