我正在尝试构建一个正则表达式,它将替换不符合格式的任何字符:
任意数量的数字,然后是可选的(单个小数点,任意位数)
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
但这似乎只允许任意数量的数字,而不是别的。
请帮忙
由于
答案 0 :(得分:8)
尝试以下步骤:
0-9
和.
.
。这是一个使用正则表达式的实现:
$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);
}