PHP Найти MAC адрес в тексте

127
13 декабря 2019, 04:20

Доброго времени суток!

Есть файлик .tmp, в котором хранится лог последней записи такого плана:

Port      Type      Link Status    Test Result                 Cable Length (M)
------  ----------  -------------  -------------------------  -----------------
15      100BASE-T   Link Up        OK                                00
DES-хххх-хх:admin# show -------
Command: ---------
 VID  VLAN Name                        MAC Address       Port  Type    Status
 ---- -------------------------------- ----------------- ----- ------- -------
 ххх  int_хх                           хх-хх-хх-хх-хх-хх

Мне нужно получить оттуда "Link Up OK" и "MAC Address"

Конкретно эти слова есть и отображаются

$text = $result;    
    $words = array("Link Up        OK", "MAC Address");
    foreach($words as $word) {
        if(strpos($text, $word) !== false) {
            echo $word ;
            //break;
        } else {
            echo "Error";
        }
    }

вот только вместо "MAC Address" я хочу получить корректное значение MAC.

Пытался делать подобный бред, но так и не понял, как это сделать

$pattern = "@^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$@";
    $st_strpos = "MAC"; 
    echo "Результат поиска в файле $result: <br>";
    if (strpos($result) && $st_strpos){
         echo "Есть такое слово";
    } else {
        echo "Нет такого слова";
    }

Как найти значение MAC?

Answer 1

Как найти значение

Можно прочитать файл в массив, и в цикле распарсить регулярным выражением. Как-то так:

$str =<<<STR
Port      Type      Link Status    Test Result                 Cable Length (M)
------  ----------  -------------  -------------------------  -----------------
15      100BASE-T   Link Up        OK                                00
DES-хххх-хх:admin# show -------
Command: ---------
 VID  VLAN Name                        MAC Address       Port  Type    Status
 ---- -------------------------------- ----------------- ----- ------- -------
 ххх  int_хх                           хх-хх-хх-хх-хх-хх
STR;
$results = [];
foreach (explode(PHP_EOL, $str) as $line) {
    $patt = '~\d+\h{5,}\d+[\pL-]+\h{2,}(\pL{3,}\h\pL+\h{7,}\pL+)|';
    $patt .= '[\pL\d]{3}\h+[\pL\d_]{3,}\h{9,}((?:[\pL\d]{2}-){5}[\pL\d]{2})~u';
    if (preg_match($patt, $line, $match)) {
        $match = array_values(array_filter($match));
        $results[] = preg_replace('~\h{2,}~', ' ', $match[1]);
    }
}
var_dump($results);

Результат:

array (size=2)
  0 => 'Link Up OK'
  1 => 'хх-хх-хх-хх-хх-хх'

P.S.: Шаблон регулярного выражения за ненадобностью можно упростить.

READ ALSO
Как реализовать кнопку &ldquo;Сохранить&rdquo; на Qt?

Как реализовать кнопку “Сохранить” на Qt?

Делаю текстовый редакторДошел до кнопки «Сохранить»

108
Результат screencap RAW в Bitmap

Результат screencap RAW в Bitmap

Screencap на Android умеет отдавать RAW картинку, как я понимаю, это framebuffer с заголовкомКак правильно привести данные RAW к формату Bmp?

140
Как подключить к Visual Studio 2017 ODB, работающий с SQLite

Как подключить к Visual Studio 2017 ODB, работающий с SQLite

Одна программа, включающая хэдер с классами и его cpp с методами, генерирует данныеНеобходимо эти данные сохранять в БД

116