【发布时间】:2022-01-15 18:20:11
【问题描述】:
我想在 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);
非常感谢。 致以最诚挚的问候
【问题讨论】:
-
这可能不是你想要的,但我会将其分解为每行规则,将 ping 结果分成几行并循环遍历它们执行 if
preg_match测试。它感觉不那么雄辩,但它更容易调试和推理。您还可以记录与您的模式不匹配的单行以查找边缘情况。
标签: php regex preg-match preg-match-all