2012-07-12 153 views
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 $结果

回答

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 
+0

哦,谢谢你,你是可靠的。问题解决了。 – Fedcomp 2012-07-12 17:50:19

+0

@Fedcomp如果你只想得到它们的数组,你可以使用'explode('',$ hex)'(两个空格作为分隔符) – Umbrella 2012-07-12 18:01:33

+0

@Umbrella:该方法实际上并不匹配所需的模式,并且会错误地输入,例如'“!?^ $”'。它也会在最后留下一个'NULL'数组元素(由于尾部空格),即使是测试输入。 – FtDRbwLXw6 2012-07-13 12:54:52

1

你怎么知道这是两个空间而不是一个标签?试试这个正则表达式:

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

请注意,我已经收窄,只匹配十六进制,不根据-36。此外,它可能是你的正则表达式不匹配,因为它正在寻找字符串末尾的空格。

0

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

相关问题