Preg_Match只有3位带点

时间:2013-12-10 00:41:00

标签: php preg-match

我有像这样的数字:

  

1.80
  2.75
  @ 1.55

这些数字是字符串,我试图让它们通过preg_match。这时我有这个:

$pattern = '/ [0-9]{1}\.[0-9]{2}/';  
$result = preg_match($pattern, $feed, $matches);

这很好用,但我的preg_match需要更高的精度,但我找不到解决方案。 使用此模式,将找到类似1.556的数字。我不想要这个,我的数字长度将是4个字符。包括点。

此外,在这里,我无法捕捉以@开头的数字,只能查看空格。我怎么能这样做?

$result = preg_match($pattern, 'test 1.556 red @1.62 blue 2.33 ?', $matches);  

这里所需的结果是1.62和2.33

3 个答案:

答案 0 :(得分:2)

作为正则表达式的替代方法,PHP - Sanitization - Filters

$array = explode(' ', 'test 1.556 red @1.62 blue 2.33 ?');

$result = filter_var_array(
    array(
        'convert' => $array
    ), 
    array(
        'convert' => array(
            'filter' => FILTER_SANITIZE_NUMBER_FLOAT, 
            'flags' => FILTER_FLAG_ALLOW_FRACTION | FILTER_FORCE_ARRAY
        )
    )
);

var_dump(array_filter(array_map('floatval', $result['convert'])));

结果:

array(3) {
  [1]=>
  float(1.556)
  [3]=>
  float(1.62)
  [5]=>
  float(2.33)
}

答案 1 :(得分:1)

以下模式会将#.##格式的所有数字与可选的前导空格或符号匹配。

[ @]?(\d{1}\.\d{2})\b

演示:http://regex101.com/r/eB4bL5

答案 2 :(得分:0)

如果你想要它达到4精度并且@被捕获那就是你需要的

$pattern = '/ @*([0-9]{1}\.[0-9]{2})\b /';