帮助解析格式化的字符串

时间:2011-03-26 17:29:08

标签: php regex string-parsing

我有字符串:

17s 283ms
48s 968ms

字符串值永远不会相同,我想从中提取“第二”值。在这种情况下,17和48。

我对正则表达式不太满意,所以我做的解决方法就是:

$str = "17s 283ms";    
$split_str = explode(' ', $str);

foreach($split_str as $val){
    if(strpos($val, 's') !== false) $sec = intval($val);
}

问题是,split_str [0]和split_str [1]中都存在的'字符,因此我的$ sec变量不断获得283而不是17。

同样,我对正则表达式不太了解,我非常确定正则表达式是这种情况下的方法。请协助。感谢。

5 个答案:

答案 0 :(得分:6)

您甚至不需要使用正则表达式。

$seconds = substr($str, 0, strspn($str, '1234567890'));

上述解决方案将从字符串的开头提取所有数字。如果第一个非数字字符是“s”,空格或其他任何内容,则无关紧要。

但为什么要这么麻烦?

您甚至可以将$str投射到int

$seconds = (int)$str; // equivalent: intval($str)

See it in action

正则表达式对于这样一个简单的任务来说是明确的过度杀伤力。不要用炸药在墙上钻孔。

答案 1 :(得分:4)

你可以这样做:

preg_match('/(?<seconds>\d+)s\s*(?<milliseconds>\d+)ms/', $var, $matches);

print_r($matches);

答案 2 :(得分:1)

如果字符串始终以这种方式格式化,您只需使用:

<?php
    $timeString = '17s 283ms';
    $seconds = substr($timeString, 0, strpos($timeString, 's')); 
?>

答案 3 :(得分:0)

嗯,我想你可以假设秒总是在毫秒之前。如果格式一致,则无需regexp。这应该这样做:

$parts = explode(' ', $str);
$seconds = rtrim($parts[0], 's')
echo $seconds; // 17s

这将按空格分割字符串并取第一部分17s。然后使用rtrim删除's',然后留下17

答案 4 :(得分:0)

(\ d + s)\ d + ms

是正确的正则表达式。用法是这样的:

$str = "17s 283ms";
$groups = array();
preg_match("/(\d+)s \d+ms/", $str, $groups);

然后,ms之前的数字为$groups[1]

相关问题