PHP从复杂的字符串中选择文本

时间:2011-11-05 01:55:45

标签: php linux preg-match-all shell-exec ifconfig

我从运行ifconfig命令的linux框中获取输出。我是通过运行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 个答案:

答案 0 :(得分:1)

对于接口的名称,这应该有效:

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

对于RX和TX字节:

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

您应该进行测试,以确保您拥有每个界面的所有信息:

  1. 测试界面名称。
  2. 测试IP号码。
  3. 测试RX字节。
  4. 测试TX字节。
  5. 当你有四个时,然后去另一个周期(例如continue)。

    P.S。小心你在系统中使用的语言,因为西班牙语你会得到“Paquetes RX:”。为了确保这一点,为了使您的代码更加健壮,您应该尝试shell_exec将环境变量LC_MESSAGES设置为en_us.utf-8