我刚刚编写了一个小脚本,用于从交换机中提取数百个MAC地址进行比较,但它们的格式为" 0025.9073.3014"而不是标准" 25:90:73:30:14"。
我很难理解如何转换它,我能想出的最好的东西就是将它们分解成碎片,然后再将它们分成2块,然后重新加入零件用":"分隔符。
我对hacky方法没问题,但这让我很烦,因为这是一种非常糟糕的方法。有没有办法更好地执行此操作?
答案 0 :(得分:3)
str_replace
和preg_replace
的组合:
$str = preg_replace('~..(?!$)~', '\0:', str_replace(".", "", $str));
首先删除.
,然后在:
两个任意字符..
之后添加(?!$)
,如果不是最后的话。{/ p>
或使用capture group并在没有str_replace的情况下执行此操作:
$str = preg_replace('~(..)(?!$)\.?~', '\1:', $str);
表现没有太大差异。
答案 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_replace
与capturing 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"