我在preg_match上非常差,我认为这是所需的功能。我试图从文本文件中的这一行获取时间值(我认为总是3位小数): -
frame= 42 q= 38.0 f_size= 909 s_size= 1kB time= 1.400 br= 218.2kbits/s avg_br= 5.2kbits/s type= I
所以,在那个例子中我想得到1.400。任何指导都非常感激,我发现正则表达式确实令人困惑。
答案 0 :(得分:6)
或者一次性获取所有值:
preg_match_all("/(\w+)=\s*(\d[\d.]*)/", $str, $uu);
$values = array_combine($uu[1], $uu[2]);
会给你:
Array
(
[frame] => 42
[q] => 38.0
[f_size] => 909
[s_size] => 1
[time] => 1.400
[br] => 218.2
[avg_br] => 5.2
)
答案 1 :(得分:2)
if(preg_match('/time\s*=\s*(\d+\.\d{3})/',$str,$matches)) {
$time = $matches[1];
}
如果你不确定小数位数或你能做的小数点的存在:
if(preg_match('/time\s*=\s*(\d+\.?\d+)/',$str,$matches)) {
$time = $matches[1];
}
答案 2 :(得分:2)
使用time=[^\d]*([\d]+\.[\d]+|[\d]+)
:
$string1 = "frame= 42 q= 38.0 f_size= 909 s_size= 1kB time= 1.400 br= 218.2kbits/s avg_br= 5.2kbits/s type= ";
$string2 = "frame= 42 q= 38.0 f_size= 909 s_size= 1kB time= 400 br= 218.2kbits/s avg_br= 5.2kbits/s type= ";
preg_match('#time=[^\d]*([\d]+\.[\d]+|[\d]+)#',$string1,$matches1);
preg_match('#time=[^\d]*([\d]+\.[\d]+|[\d]+)#',$string2,$matches2);
print $matches1[1]; // prints 1.400
print $matches2[1]; // prints 400
答案 3 :(得分:1)
$match = preg_match('/time=\\s*(\\d+(\\.\\d+)?)/', $row, $matches);
$time = $matches[1];
这样做是匹配的:
time=
\s*
)\d+
)(\.\d+)?
)所以它实际上比数字点三位更宽松:它将匹配任何整数或浮点数,任意数量的十进制数字。