Я только что написал небольшой скрипт для извлечения сотен MAC-адресов из коммутатора для сравнения, однако они отформатированы как «0025.9073.3014», а не как «00: 25: 90: 73: 30: 14».
Я поставлен в тупик о том, как преобразовать это, где лучшее, что я могу придумать, это разбить их на части в «.», Затем разбить их на две части, а затем соединить все части с разделителями «:».
Я в порядке с хакерскими методами, но это беспокоит меня, потому что это очень плохой подход. Есть ли способ сделать это лучше?
Сочетание str_replace
а также preg_replace
:
$str = preg_replace('~..(?!$)~', '\0:', str_replace(".", "", $str));
Первый зачистка .
затем добавление :
после ..
два любых персонажа (?!$)
если не в конце.
Или используйте группа захвата и сделать это без str_replace:
$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
С помощью preg_replace
с захват групп, обратные ссылки:
$mac = "0025.9073.3014";
$mac = preg_replace('/(..)(..)\.(..)(..)\.(..)(..)/',
'$1:$2:$3:$4:$5:$6', $mac);
echo($mac);
// => 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"