2013-01-04 85 views
-2

没有与服务器的动态运行时间输出一个字符串
例如为:字符串匹配用浮子短语

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和/或正则表达式最短的变种?

编辑:对不起,忘了提,绳包括动态内容

+0

你唯一需要的部分是'3天,9:25'吗? –

+0

是的,但这部分是动态的,它也可以是“6:12”而没有天 – user947668

+1

@ user947668这一点的信息会改变正则表达式相当多。您应该考虑使用这些信息来更新问题,也可以考虑让用户测试一些情况。 –

回答

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

编辑:回声结果进行修正。

+0

将输出:'up3days' – Madbreaks

+0

不再。谢谢。 – devOp

+2

除非你编辑它,否则不会让我失望。 – Madbreaks

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

+0

可能是危险的,因为天数可能大于1位...... – devOp

+0

@devOp不,因为我切断了(错误地假设的静态部分)的开始。当天数的位数增加时,'strpos()'的值也会增加,因为'''向右移动:)但是,您是“一种正确的”,因为正常运行时间可能会超过24小时。我会看看它 – KingCrunch

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; 

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

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

+0

哈克,谢谢你的扩展答案。不幸的是你的模式在几种情况下会失败。无论如何,我发现另一种方式如何解决我的问题,但解决方案是不相关的PHP /正则表达式解析。 – user947668

+0

@ user947668:这就是我最后注意到的部分。该模式必须写成适合输出。由于您没有详细说明输出,我无法提出更具体的建议。但除此之外,关键是要学习如何创建这些模式,而不是如果这里有一个问题包含你需要的确切的问题(至少没有这样一个不明确的问题)。如果这遵循一些标准,则命名该标准,勾勒它,使问题具体*但通用,以便它对许多人有用。比正则表达式的答案可以在这里很好的参考。 – hakre

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 

正则表达式可以更紧凑,但数量不多没有使它过于宽松。这个(至少)有一个小问题 - 它会允许一个以0:开始的时间,但我已经花了太多时间在这个上了,嘿。