转换MAC地址格式

时间:2014-10-03 10:35:12

标签: php regex formatting mac-address

我刚刚编写了一个小脚本,用于从交换机中提取数百个MAC地址进行比较,但它们的格式为" 0025.9073.3014"而不是标准" 25:90:73:30:14"。

我很难理解如何转换它,我能想出的最好的东西就是将它们分解成碎片,然后再将它们分成2块,然后重新加入零件用":"分隔符。

我对hacky方法没问题,但这让我很烦,因为这是一种非常糟糕的方法。有没有办法更好地执行此操作?

4 个答案:

答案 0 :(得分:3)

str_replacepreg_replace的组合:

$str = preg_replace('~..(?!$)~', '\0:', str_replace(".", "", $str));

首先删除.,然后在:两个任意字符..之后添加(?!$),如果不是最后的话。{/ p>

Test at eval.in


或使用capture group并在没有str_replace的情况下执行此操作:

$str = preg_replace('~(..)(?!$)\.?~', '\1:', $str);

Test at regex101.com

表现没有太大差异。

答案 1 :(得分:3)

如果你不喜欢正则表达式,那么这是另一种方法,如果你是PHP的新手,这是更容易理解的。基本上,它只是删除了点,然后在每2个字符后将字符串拆分成一个数组,然后用冒号将它们内爆:

$string = "0025.9073.3014";
$result = implode(":", str_split(str_replace(".", "", $string), 2));
echo $result;

输出:

  

00:25:90:73:30:14

答案 2 :(得分:1)

preg_replacecapturing groups, backreferences一起使用:

$mac = "0025.9073.3014";
$mac = preg_replace('/(..)(..)\.(..)(..)\.(..)(..)/',
                    '$1:$2:$3:$4:$5:$6', $mac);
echo($mac);
// => 00:25:90:73:30:14

答案 3 :(得分:0)

另一种选择,如果mac地址在这种格式下是常量。

$str = '0025.9073.3014';
$str = preg_replace('~\d+\K(?=\d\d)|\.~', ':', $str);
echo $str; //=> "00:25:90:73:30:14"