猿问

Regex match a mac address without semi-columns

我试图理解为什么下面的函数返回奇怪的结果


<?

$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

    )

)


繁星coding
浏览 75回答 1
1回答

慕婉清6462132

你的正则表达式包含一个重复的捕获组,&nbsp;([a-fA-F0-9]){12}, 即一个十六进制字符被捕获到一个组中,然后该组的值被重写了 11 次以上(总共 12 次),所以最后捕获的十六进制字符落在第二个匹配子数组(在您与输入字符串获得的每个匹配中,它是5,因此,您的第二个数组中有两个5s)。没有锚定在两边,所以它可以在字符串内的任何地方找到,所以你得到两个匹配项,001122334455被匹配并且001122334455in0011223344556677也被匹配。删除捕获括号并使用整个单词匹配模式,如# Word boundariespreg_match_all('/\b[a-fA-F0-9]{12}\b/', $str, $matches)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# Whitespace boundariespreg_match_all('/(?<!\S)[a-fA-F0-9]{12}(?!\S)/', $str, $matches)&nbsp; &nbsp;# Hex char boundariespreg_match_all('/(?<![a-fA-F0-9])[a-fA-F0-9]{12}(?![a-fA-F0-9])/', $str, $matches)&nbsp;
随时随地看视频慕课网APP
我要回答