正则表达式替换为小数

时间:2009-07-17 10:26:24

标签: php regex

我正在尝试构建一个正则表达式,它将替换不符合格式的任何字符:

任意数量的数字,然后是可选的(单个小数点,任意位数)

i.e.
123            // 123
123.123        // 123.123
123.123.123a   // 123.123123
123a.123       // 123.123

我在php中使用ereg_replace,并且最接近我管理的正则表达式是

ereg_replace("[^.0-9]+", "", $data);

这几乎是我需要的(除了它将允许任意数量的小数点)

i.e.
123.123.123a    // 123.123.123

我的下次尝试是

ereg_replace("[^0-9]+([^.]?[^0-9]+)?", "", $data);

which was meant to translate as
[^0-9]+        // any number of digits, followed by
(              // start of optional segment
  [^.]?        // decimal point (0 or 1 times) followed by
  [^0-9]+      // any number of digits
)              // end of optional segment
?              // optional segment to occur 0 or 1 times

但这似乎只允许任意数量的数字,而不是别的。

请帮忙

由于

2 个答案:

答案 0 :(得分:8)

尝试以下步骤:

  1. 删除除0-9.
  2. 之外的任何字符
  3. 删除第一个小数点后面的任何.
  4. 这是一个使用正则表达式的实现:

    $str = preg_replace('/[^0-9.]+/', '', $str);
    $str = preg_replace('/^([0-9]*\.)(.*)/e', '"$1".str_replace(".", "", "$2")', $str);
    $val = floatval($str);
    

    另一个只有一个正则表达式:

    $str = preg_replace('/[^0-9.]+/', '', $str);
    if (($pos = strpos($str, '.')) !== false) {
        $str = substr($str, 0, $pos+1).str_replace('.', '', substr($str, $pos+1));
    }
    $val = floatval($str);
    

答案 1 :(得分:1)

实际上这应该更快。它更具可读性。 ; - )

$s = preg_replace('/[^.0-9]/', '', '123.123a.123');
if (1 < substr_count($s, '.')) {
    $a = explode('.', $s);
    $s = array_shift($a) . '.' . implode('', $a);
}