【问题标题】:PHP select text from a complex stringPHP 从复杂字符串中选择文本
【发布时间】:2011-11-05 12:17:58
【问题描述】:

我正在从运行 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 字节?

谢谢。

【问题讨论】:

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


【解决方案1】:

对于接口的名称,这应该可以:

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

对于 RX 和 TX 字节:

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

您应该进行测试以确保您拥有每个接口的所有信息:

  1. 测试接口名称。
  2. 测试 IP 号。
  3. 测试 RX 字节。
  4. 测试 TX 字节。

当你有四个时,再进行另一个循环(例如continue)。

附:请注意您在系统中使用的语言,因为使用西班牙语会得到“Paquetes RX:”。可以肯定的是,为了使您的代码更加健壮,您应该尝试使shell_exec 将环境变量LC_MESSAGES 设置为en_us.utf-8。

【讨论】:

  • 谢谢你。除了名称,这个不起作用。我自己尝试了一些东西,但它似乎不起作用。谢谢,我会考虑更改该设置。
猜你喜欢
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2012-03-25
  • 2015-05-14
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多