PHP的逻辑和获取数组的部分

时间:2017-04-18 11:34:14

标签: php arrays regex logic output

我找到了一段代码,通过php显示对服务器的ping,我想知道是否有可能实现不同的输出,但我很难确定逻辑。

代码:

             <?php
             $cmd = "ping 8.8.8.8 -c 1";

             $descriptorspec = array(
             0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
             1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
             2 => array("pipe", "w")    // stderr is a pipe that the child will write to
             );
             flush();
             $process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());
             echo "<pre>";
             if (is_resource($process)) {
                 while ($s = fgets($pipes[1])) {
                     print $s;
                 }
             }
             echo "</pre>";
             ?>

当前输出:

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=54 time=28.278 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 28.278/28.278/28.278 ms

通缉输出:

我只想要ms值或“time”

28.278

试验:

我试图通过运行它来获取“$s”或“$pipes”变量/数组的值,包括对数组值“[1]”等的一些试验以下代码:

str_replace("time=","@@",$test_stringget_ping_res);
str_replace(" ms","@@",$test_stringget_ping_res);

但我得到“无法打开规则文件”。

2 个答案:

答案 0 :(得分:2)

您可以使用以下preg_match()

preg_match('/time=(.*?) ms/', $s, $m );
print $m[1];

您的代码如下:

 if (is_resource($process)) {
 while ($s = fgets($pipes[1])) {
     preg_match('/time=(.*?) ms/', $s, $m );
     print $m[1];
     print $s;
   }
 }

说明:简单捕捉time=ms之间的所有内容。

<强> Ideone Demo

查看preg_match()文档以供使用。

答案 1 :(得分:1)

您可以将命令更改为:

ping -c 1 8.8.8.8 | tail -1 | cut -d/ -f 5