Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 转换MAC地址格式_Php_Regex_Formatting_Mac Address - Fatal编程技术网

Php 转换MAC地址格式

Php 转换MAC地址格式,php,regex,formatting,mac-address,Php,Regex,Formatting,Mac Address,我刚刚编写了一个小脚本,从交换机中提取数百个MAC地址进行比较,但是它们的格式是“0025.9073.3014”,而不是标准的“00:25:90:73:30:14” 我被如何转换这个问题难住了,我能想到的最好办法是在“.”处将这些分解成碎片,然后进一步将它们分解为每个2块,然后用“:”分隔符重新连接所有部分 我对黑客的方法很满意,但这让我很困扰,因为这是一种非常糟糕的方法。有什么方法可以更好地执行此操作吗?使用: str\u replace和preg\u replace的组合: $str = p

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

我被如何转换这个问题难住了,我能想到的最好办法是在“.”处将这些分解成碎片,然后进一步将它们分解为每个2块,然后用“:”分隔符重新连接所有部分

我对黑客的方法很满意,但这让我很困扰,因为这是一种非常糟糕的方法。有什么方法可以更好地执行此操作吗?

使用:


str\u replace
preg\u replace
的组合:

$str = preg_replace('~..(?!$)~', '\0:', str_replace(".", "", $str));
首先剥离
,然后在
之后添加
任何字符中的两个
(?!$)
,如果不在末尾


或者使用一种无需str_替换的方法:

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


性能上没有太大差别。

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

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

00:25:90:73:30:14


另一个选项,如果mac地址在此格式中保持不变

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

奇怪的是,这只在特定的MAC地址上有效,在其他地址上无效,但感谢您的示例@BrettPowell,我应该用
而不是
\d
,因为mac地址包含十六进制。我相应地更新了答案。谢谢你的反馈。
$str = '0025.9073.3014';
$str = preg_replace('~\d+\K(?=\d\d)|\.~', ':', $str);
echo $str; //=> "00:25:90:73:30:14"