当前位置: 首页 > 知识库问答 >
问题:

PHP解析Ping命令输出与preg_匹配

咸弘雅
2023-03-14

我想在Linux中解析ping命令的输出。我当前的代码运行良好,唯一的问题是,它只解析第一个结果。我想把它改成解析每一行。

红色标记的行也应该被解析:https://i.imgur.com/GDE19Xl.png我必须改变什么才能做到这一点?

这是我当前的正则表达式:https://regex101.com/r/uH0XwP/1

这是当前的PHP代码:

$re = '/^PING\b[^(]*\(([^)]*)\)\s([^.]*)\..*?^(\d+\sbytes).*?icmp_seq=(\d+).*?ttl=(\d+).*?time=(.*?ms).*?(\d+)\spackets\stransmitted.*?(\d+)\sreceived.*?(\d+%)\spacket\sloss.*?time\s(\d+ms).*?=\s([^\/]*)\/([^\/]*)\/([^\/]*)\/(.*?)\sms/ims';
$str = 'PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=0.816 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=0.883 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=58 time=0.743 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=58 time=0.613 ms

--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3033ms
rtt min/avg/max/mdev = 0.613/0.763/0.883/0.105 ms
';

preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);

// Print the entire match result
var_dump($matches);

非常感谢。致以最良好的问候

共有1个答案

东方俊力
2023-03-14

如果您的数据是这样的结构,您可以使用\G锚定

(?:^PING\b[^(]*\(([^)]*)\)\s([^.]*)\..*|\G(?!^))\R^(\d+\sbytes).*?icmp_seq=(\d+).*?ttl=(\d+).*?time=(.*?ms).*(?:\s+---.*\R(\d+)\spackets\stransmitted.*?(\d+)\sreceived.*?(\d+%)\spacket\sloss.*?time\s(\d+ms)\R.*=\s([^\/]*)\/([^\/]*)\/([^\/]*)\/(.*?)\sms)?

正则表达式演示

在您的模式中,多次出现* ,也可以用更具体的部分替换,如空格或带有可选小数部分的数字

(?:^PING\b[^(]*\(([^)]*)\)\s([^.]*)\.|\G(?!^))\R(\d+\sbytes).*?icmp_seq=(\d+)\h+ttl=(\d+).*?time=(\d+(?:\.\d+)?\h+ms).*(?:\s+---.*\R(\d+)\spackets\stransmitted.*?(\d+)\sreceived,\h*(\d+%)\spacket\sloss,\h+time\s(\d+ms)\R.*=\s(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\sms)?

然后使用preg_match_,所有值都在第3组-第6组中

PHP演示

另一个选项是匹配捕获组中中间的重复数据,并分别处理这些行。在下一个模式中,捕获组3包含可以在第二步中单独解析的重复行。

^PING\b[^(]*\(([^)]*)\)\s([^.]*)\.\R(\d+\sbytes.*?icmp_seq=\d+\h+ttl=\d+\h+time=\d+(?:\.\d+)?\h+ms(?:\R\d+\sbytes.*?icmp_seq=\d+\h+ttl=\d+\h+time=\d+(?:\.\d+)?\h+ms)*)\R+---.*\R(\d+)\spackets\stransmitted.*?(\d+)\sreceived,\h*(\d+%)\spacket\sloss,\h+time\s(\d+ms)\R.*=\s(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\sms

查看另一个正则表达式演示。

 类似资料:
  • 这总是返回false。我使用了唯一的工具来构建正则表达式,它在那里工作得很好。当我在正则表达式中添加“/”时,问题开始了。不知何故PHP似乎需要这些,但我不知道为什么,我不知道为什么它打破了我的正则表达式。 它应该返回TRUE的东西。像"2012-08-24 20:30:00"和FALSE的"asdf2012-08-24 20:30:00asdf"或任何不符合我的正则表达式 提前谢谢! -----

  • 现在,你已经在运用 MATLAB 的命令行了,输入命令语句,就会看到结果出现在命令窗口中。 这一节介绍如何: 控制输出值的格式 用MATLAB命令隐藏输出 在命令行中输入长的命令 编辑命令行

  • 本文向大家介绍mysql 协议的ping命令包及解析详解及实例,包括了mysql 协议的ping命令包及解析详解及实例的使用技巧和注意事项,需要的朋友参考一下 mysql 协议的ping命令包及解析详解 前言: MySQL客户端可以用ping命令来检查服务端的状态,正常会返回ok包。 mysql通信报文结构 类型 名字 描述 int<3> payload长度 按照the least signifi

  • 本文向大家介绍mysql导入导出命令解析,包括了mysql导入导出命令解析的使用技巧和注意事项,需要的朋友参考一下 mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。下面就让我们一起学习吧! 一、mysqldump:数据库备份程序  有3种方式来调用mysqldump: 如果没有指定任

  • 本文向大家介绍shell(bash)下“time” 命令的输出详解,包括了shell(bash)下“time” 命令的输出详解的使用技巧和注意事项,需要的朋友参考一下 前言 相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便。但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定向至一个文本文件,只能显示

  • 问题内容: 我正在编写一项服务,该服务必须将已执行命令的输出流式传输到父级和日志中。当过程很长时,问题是给我最终的(字符串)结果。 是否可以给出正在发生的事情的部分输出,例如在shell中 PS仅输出将是: 但就我而言,这还不够。 问题答案: 您发布的代码有效(执行了合理的命令)。 这是用Go语言编写的一个简单的 “长时间运行的任务” ,供您调用和测试您的代码: 编译它并作为命令来调用它。您将看到