PHP выделить текст из сложной строки - PullRequest
1 голос
/ 05 ноября 2011

Я получаю вывод из моего linux-бокса с командой ifconfig. Я делаю это с помощью команды shell_exec. Я нашел пример, но я не могу работать с ним дальше.

Это мой текущий код.

public function get_network_interfaces() {

    // Run the command.
    $cmd_exec = shell_exec("/sbin/ifconfig");

    // Get the pattern.
    $pattern = '/inet addr:([\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3})/';

    if (preg_match_all($pattern, $cmd_exec, $matches)) {
        $interfaces = $matches[1];
        return $interfaces;         
    }

}

Вывод этого (после foreach'ing) просто; 192.168.1.1/127.0.0.1, поскольку он имеет два сетевых адаптера, вывод ifconfig:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:38:b8:1c  
      inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: 2a02:2308::216:3eff:fe38:b81c/64 Scope:Global
      inet6 addr: fe80::216:3eff:fe38:b81c/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:10612623 errors:0 dropped:0 overruns:0 frame:0
      TX packets:151855 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:539434883 (514.4 MiB)  TX bytes:37861938 (36.1 MiB)
      Interrupt:30
lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:6662 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6662 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:768641 (750.6 KiB)  TX bytes:768641 (750.6 KiB)

То, что я пытаюсь получить, похоже на имена интерфейсов (eth0 и lo), а также добавление inet (которое уже работает), за которыми следуют байты RX и байты TX. Если имя слишком сложно получить, пусть будет так. Но кто-нибудь может объяснить мне, как получить байты RX и байты TX?

Спасибо.

1 Ответ

1 голос
/ 05 ноября 2011

Для имен интерфейсов это должно работать:

$pattern = '/^(\w*)\s*Link encap.*$/';

Для байтов RX и TX:

$pattern = '/RX packets:(\d*) /';
$pattern = '/TX packets:(\d*) /';

И вы должны проверить, чтобы убедиться, что у вас есть вся информация для каждого интерфейса:

  1. Проверка имени интерфейса.
  2. Проверка номера IP.
  3. Проверка байта RX.
  4. Проверка байта TX.

и когда у вас их четыре, переходите к другому циклу (например, с continue).

P.S. Будьте осторожны с языком, который вы используете в своей системе, потому что с испанским вы получаете «Paquetes RX:». Просто чтобы быть уверенным, и для того, чтобы сделать ваш код более надежным, вы должны попытаться сделать shell_exec для установки переменной среды LC_MESSAGES в en_us.utf-8, например.

...