-3

有一个带有服务器动态正常运行时间输出的字符串,
例如:

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 user”短语可能存在也可能不存在。我只需要获取此字符串的正常运行时间部分,即:“ 3 days, 9:25

使用 php 或/和正则表达式执行此操作的最短变体是什么?

编辑:对不起,忘了提到该字符串由动态内容组成

4

4 回答 4

3

尽管使用正则表达式可能很容易(如果您知道正则表达式),但我会说最好自己完成以下内容来了解​​ PHP:

  1. 找到' up '(见strpos())的第一个位置。
  2. 从该位置查找 的下一个位置', '
  3. 从该位置找到', '(再次)的下一个位置。
  4. 从 1. 的位置和 1. 中搜索字符串的长度到 3. 中找到的位置,得到有substr()问题的字符串。

那么你就有了结果。我将此作为练习来编写具体代码。如果您在编写它时遇到任何问题,请告诉我。


只是看到你的评论,你不确定是否真的有两个逗号。然后,您可能需要从后面查找逗号。


在某种程度上,一个正则表达式就派上用场了,因为它可以非常精确地制定匹配条件,并且可以使某些部分成为可选的:

$pattern = '/(?<= up )(?:\d+ days?, )?\d{1,2}:\d\d/';
$uptime  = preg_match($pattern, $subject, $m) ? $m[0] : FALSE;

这就像在上面的纯 PHP 大纲中搜索第一个位置一样向后看' up '(这就是为什么最好先用 PHP 字符串函数编写东西,学习并了解如何构建正则表达式是很好的),然后它正在寻找可选的日期模式。这里正则表达式非常强大,因为它很容易表达寻找数字。然后终于寻找时间的数字。

也许这仍然需要一些修改,我不完全确定小时/分钟部分的正常运行时间模式。例如,如果是一天零一分钟呢?还是只有一天零分钟?那时会发生什么?

于 2013-01-04T20:53:39.940 回答
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);

请参阅http://codepad.viper-7.com/gDG4Lf

于 2013-01-04T20:49:50.270 回答
0

由于您要求使用正则表达式:

$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:,但我已经在这方面花费了太多时间,呵呵。

于 2013-01-04T20:54:18.100 回答
-1

您可以在没有正则表达式的情况下执行此操作,只需使用以下explode()命令:

$str = "20:17:49 3 天,9:25,1 个用户,平均负载:1.19, 1.34, 1.36";
$array = explode(" ", $str);
回声 $array[2] 。“”。$数组[3] 。“”。$数组[4];

编辑:回声结果的更正。

于 2013-01-04T20:49:06.377 回答