正则表达式 - 如何从文本文件的行中获取此值?

时间:2010-12-24 11:16:19

标签: php regex string preg-match

我在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。任何指导都非常感激,我发现正则表达式确实令人困惑。

4 个答案:

答案 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];
}

See it

答案 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+
  • 跟随可选 by:一个点,然后是一个或多个数字((\.\d+)?

所以它实际上比数字点三位更宽松:它将匹配任何整数或浮点数,任意数量的十进制数字。