我試圖理解為什么下面的函數返回奇怪的結果<?$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 關注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消