有一个字符串,其中包含服务器的动态正常运行时间输出
e.g:
20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36
22:00:12 up 1 min, load average: 1.39, 0.46, 0.16
06:40:39 up 445 days, 1:08, 3 users, load average: 0.01, 0.01, 0.00
其中“,1个用户”短语可能存在也可能不存在。 我只需要获得此字符串的正常运行时间即:“ 3天,9:25 ”
使用php或/和regex执行此操作的最短变体是什么?
编辑:抱歉,忘记提及该字符串包含动态内容
答案 0 :(得分:3)
即使使用正则表达式(如果你知道正则表达式)这可能很容易,我会说这是最好的自己来学习PHP以下内容:
' up '
的第一个位置(请参阅strpos()
)。', '
。', '
的下一个位置(再次)。substr()
。然后你有你的结果。我把它留作练习来编写具体的代码。如果你有任何问题,请告诉我。
只是看到你的评论,你不确定是否真的有两个逗号。然后你可能需要从后面查找逗号。
在某种程度上,然后是正则表达式,因为它可以非常精确地表达匹配条件并且可以使某些部分可选:
$pattern = '/(?<= up )(?:\d+ days?, )?\d{1,2}:\d\d/';
$uptime = preg_match($pattern, $subject, $m) ? $m[0] : FALSE;
这就像在上面的纯PHP大纲中搜索' up '
的第一个位置一样(这就是为什么用PHP字符串函数首先编写东西很好,这很好学习并了解如何然后可以构建正则表达式,然后它正在寻找可选的日期模式。这里的正则表达式非常强大,因为它很容易表达寻找数字。然后终于寻找时间的数字。
也许这仍然需要一些修改,我不完全确定小时/分钟部分的正常运行时间模式。如果是一天一分钟怎么办?或者只是一天0分钟?那会发生什么?
答案 1 :(得分:1)
<?php
$string = '20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36';
$result = substr($string, strpos($string, 'up')+3, strpos($string, ',') - strpos($string, 'up')+3);
答案 2 :(得分:0)
由于您要求提供RegEx:
$regEx = '/.+? up (?:([1-9]+ days, ))?([1]?\d{1}:[0-5]\d{1}).*+/';
// With days included:
$str = '20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36';
echo preg_replace($regEx, "$1$2", $str);
3 days, 9:25
// No days included:
$str = '20:17:49 up 9:25, 1 user, load average: 1.19, 1.34, 1.36';
echo preg_replace($regEx, "$1$2", $str);
9:25
RegEx可能更紧凑,但如果不太宽松则不会太多。这有一个小问题(至少) - 它会允许以0:
开头的时间,但我已经花了太多时间在这上面,呵呵。
答案 3 :(得分:-1)
只需使用explode()
命令,即可使用正则表达式执行此操作:
$str = "20:17:49 up 3 days, 9:25, 1 user, load average: 1.19, 1.34, 1.36"; $array = explode(" ", $str); echo $array[2] . " " . $array[3] . " " . $array[4];
编辑:校正回声结果。