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

标签 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)

我想要获得的是接口(interface)的名称(eth0 和 lo),以及 inet 添加(已经在工作),后跟 RX 字节和 TX 字节。 如果名字太难取,那就这样吧。但是谁能解释一下如何获取 RX 字节和 TX 字节?

谢谢。

最佳答案

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

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

对于 RX 和 TX 字节:

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

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

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

当你有四个时,然后进行另一个循环(例如使用 continue)。

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

关于PHP 从复杂的字符串中选择文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017621/

相关文章:

php - 如何将 PHP 变量传递给 colorbox?

php - 在 PHP 中使用 WAMP 服务器记录错误

linux - 为什么我无法在Docker容器中进行CD播放?

php - 从 PHP 发送大量电子邮件

php - 无法在 php 中回显 jquery(使用 ajax)变量

linux - Linux和处理器之间的兼容性

linux - CAN-utils和socket可以

php - 使用 PHP 从选项卡中提取和弦

php - preg_match_all - 从模板中提取键/值

php - 如何在 PHP 中获取字符串中的所有美元符号及其后面的文本