【问题标题】:Convert MAC Address Format转换 MAC 地址格式
【发布时间】:2023-03-31 19:50:01
【问题描述】:

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

我不知道如何转换它,我能想到的最好的方法是在“。”处将它们分解成碎片,然后将它们进一步分解成 2 块,然后用“:”分隔符重新连接所有部分.

我可以使用 hacky 方法,但这让我很困扰,因为这是一种非常糟糕的方法。有什么方法可以更好地执行此操作?

【问题讨论】:

    标签: php regex formatting mac-address


    【解决方案1】:

    str_replacepreg_replace 的组合:

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

    首先去除.,然后在.. 两个任意字符(?!$) 之后添加:,如果不是在末尾。

    Test at eval.in


    或者使用capture group 并且不使用str_replace:

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

    Test at regex101.com

    性能差别不大。

    【讨论】:

      【解决方案2】:

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

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

      输出:

      00:25:90:73:30:14

      【讨论】:

        【解决方案3】:

        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
        

        【讨论】:

        • 奇怪的是,这只适用于那个特定的 MAC 地址,而在其他 MAC 地址上却失败了,但谢谢你的例子!
        • @BrettPowell,我应该使用. 而不是\d,因为mac 地址包含十六进制。我相应地更新了答案。感谢您的反馈。
        【解决方案4】:

        另一个选项,如果 mac 地址在这种格式中是常量。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-10
          • 2013-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多