ondalık için yerine regex

2 Cevap php

Ben formatında herhangi karakterlerin yerini alacak bir regex inşa çalışıyorum:

numaraların herhangi, daha sonra isteğe bağlı (tek ondalık basamak herhangi bir sayıda)

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

Ben php ereg_replace kullanan ve i başarmış bir çalışma regex en yakın am

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

i need neredeyse ne olduğu (o ondalık noktalarının herhangi bir sayı sağlayacak dışında)

i.e.
123.123.123a    // 123.123.123

sonraki girişimi oldu

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

ama bu sadece bir basamak sayısını ve başka bir şey izin görünüyor.

Lütfen yardım

Teşekkürler

2 Cevap

Bu adımları deneyin:

  1. 0-9 ve . dışındaki herhangi bir karakteri kaldırın
  2. ilk virgülden arkasında herhangi bir . çıkarın.

İşte düzenli ifadeler ile bir uygulama var:

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

Ve sadece tek bir düzenli ifade ile başka bir:

$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);

Bu aslında, daha hızlı olmalı. Ve bu şekilde daha okunabilir. ;-)

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