1

我有字符串:

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

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

同样,我对正则表达式不是很好,而且我很确定正则表达式是这种情况下要走的路。请协助。谢谢。

4

5 回答 5

6

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

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

上述解决方案将从字符串的开头提取所有数字。第一个非数字字符是“s”、空格还是其他任何字符都没有关系。

但是为什么要打扰呢?

您甚至可以只$str转换为int

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

看到它在行动

对于这样一个简单的任务,正则表达式绝对是矫枉过正。不要使用炸药在墙上钻孔。

于 2011-03-26T17:33:43.130 回答
4

你可以这样做:

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

print_r($matches);
于 2011-03-26T17:34:07.923 回答
1

如果字符串总是以这种方式格式化,您可以简单地使用:

<?php
    $timeString = '17s 283ms';
    $seconds = substr($timeString, 0, strpos($timeString, 's')); 
?>
于 2011-03-26T17:33:49.837 回答
0

好吧,我想你可以假设秒总是在毫秒之前。如果格式一致,则不需要正则表达式。这应该这样做:

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

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

于 2011-03-26T17:32:55.800 回答
0

(\d+s)\d+ms

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

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

然后,您在 ms 之前的号码将是$groups[1]

于 2011-03-26T17:33:10.243 回答