字符串与浮动短语匹配

时间:2013-01-04 20:44:50

标签: php regex

有一个字符串,其中包含服务器的动态正常运行时间输出
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执行此操作的最短变体是什么?

编辑:抱歉,忘记提及该字符串包含动态内容

4 个答案:

答案 0 :(得分:3)

即使使用正则表达式(如果你知道正则表达式)这可能很容易,我会说这是最好的自己来学习PHP以下内容:

  1. 找到' up '的第一个位置(请参阅strpos())。
  2. 从该位置查找', '
  3. 的下一个位置
  4. 从该位置查找', '的下一个位置(再次)。
  5. 从1.的位置和1.中搜索字符串的长度,长度直到在3中找到的位置,得到相关字符串的substr()
  6. 然后你有你的结果。我把它留作练习来编写具体的代码。如果你有任何问题,请告诉我。


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


    在某种程度上,然后是正则表达式,因为它可以非常精确地表达匹配条件并且可以使某些部分可选:

    $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);

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

答案 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];

编辑:校正回声结果。