我试图理解为什么下面的函数返回奇怪的结果<?$string = "001122334 001122334455 0011 0011223344556677";preg_match_all('/([a-fA-F0-9]){12}/', $str, $matches);?>我不明白为什么 001122334455 出现两次,为什么 5 5 在那里。我正在寻找没有半列匹配的 MAC 地址输出Array( [0] => Array ( [0] => 001122334455 [1] => 001122334455 )[1] => Array ( [0] => 5 [1] => 5 ))
1 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
你的正则表达式
包含一个重复的捕获组,
([a-fA-F0-9]){12}
, 即一个十六进制字符被捕获到一个组中,然后该组的值被重写了 11 次以上(总共 12 次),所以最后捕获的十六进制字符落在第二个匹配子数组(在您与输入字符串获得的每个匹配中,它是5
,因此,您的第二个数组中有两个5
s)。没有锚定在两边,所以它可以在字符串内的任何地方找到,所以你得到两个匹配项,
001122334455
被匹配并且001122334455
in0011223344556677
也被匹配。
删除捕获括号并使用整个单词匹配模式,如
# Word boundaries
preg_match_all('/\b[a-fA-F0-9]{12}\b/', $str, $matches)
# Whitespace boundaries
preg_match_all('/(?<!\S)[a-fA-F0-9]{12}(?!\S)/', $str, $matches)
# Hex char boundaries
preg_match_all('/(?<![a-fA-F0-9])[a-fA-F0-9]{12}(?![a-fA-F0-9])/', $str, $matches)
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报
0/150
提交
取消