2009-07-17 4 views
2

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

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

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 

, но это только кажется, чтобы любое количество цифр и ничего больше.

Пожалуйста, помогите

Благодарности

+0

ereg_ * функции устарели. вместо этого используйте preg_ *. –

ответ

8

Выполните следующие действия:

  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); 
+0

Thankyou, оба работают как шарм - из интереса вы можете объяснить «$ 1» и «$ 2» - эти обратные линии из регулярного выражения? (+1 upvote) – JimmyJ

+0

Да, '$ 1' и' $ 2' являются ссылками на совпадение шаблона '/^([0-9] * \.) (. *) /'. Флаг 'e' должен обрабатывать замену как выполняемое выражение и использовать возвращаемое значение в качестве замены. Итак, '' "$ 1" .str_replace (".", "", "$ 2") ''оценивается и' $ 1' и '$ 2' заменяются согласованными значениями ранее. – Gumbo

+0

Еще раз спасибо, я думаю, мне нужно пойти в школу регулярных курсов;) – JimmyJ

1

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

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

Thankyou, это также хорошо работает (+1 upvote) – JimmyJ

Смежные вопросы