0

我试图弄清楚为什么这个正则表达式与这条线不匹配,但我没有更多的想法。

(?:([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

4

3 回答 3

2

你怎么知道那是两个空格而不是一个制表符?试试这个正则表达式:

/^(?:([a-f0-9]{2})\s*)+$/i

请注意,我已将其范围缩小为仅匹配十六进制,而不是 base-36。此外,您的正则表达式可能不匹配,因为它正在寻找字符串末尾的空格。

于 2012-07-12T17:23:04.403 回答
1

该正则表达式确实与该行匹配,假设您粘贴到问题中的行正是您要匹配的行:

<?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
于 2012-07-12T17:30:58.973 回答
0

只有几个原因,为什么这不符合您的输入。请检查该行是否以两个空格结尾,以及每个数字之间是否真的有两个空格字符。还要检查您的输入是否包含字符代码 160(牢不可破的空格),因为据我所知 PCRE 不会将其识别为 \s。

于 2012-07-12T17:38:08.350 回答