我有字符串:
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。
同样,我对正则表达式不太了解,我非常确定正则表达式是这种情况下的方法。请协助。感谢。
答案 0 :(得分:6)
您甚至不需要使用正则表达式。
$seconds = substr($str, 0, strspn($str, '1234567890'));
上述解决方案将从字符串的开头提取所有数字。如果第一个非数字字符是“s”,空格或其他任何内容,则无关紧要。
您甚至可以将$str
投射到int
:
$seconds = (int)$str; // equivalent: intval($str)
正则表达式对于这样一个简单的任务来说是明确的过度杀伤力。不要用炸药在墙上钻孔。
答案 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]
。