регулярное выражение заменить для десятичных - PullRequest
2 голосов
/ 17 июля 2009

Я пытаюсь построить регулярное выражение, которое заменит любые символы не в формате:

любое количество цифр, затем необязательно (одна десятичная точка, любое количество цифр)

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

Я использую ereg_replace в php, и наиболее близким к рабочему регулярному выражению, которым я управлял, является

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 ]

8 голосов
/ 17 июля 2009

Попробуйте выполнить следующие действия:

  1. удалить любой символ, кроме 0-9 и .
  2. удалить все . после первой десятичной точки.

Вот реализация с регулярными выражениями:

$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 голос
/ 17 июля 2009

Это должно быть быстрее, на самом деле. И это намного удобнее для чтения. ; -)

$s = preg_replace('/[^.0-9]/', '', '123.123a.123');
if (1 < substr_count($s, '.')) {
    $a = explode('.', $s);
    $s = array_shift($a) . '.' . implode('', $a);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...