2009-07-17 16 views
2

ich einen regulären Ausdruck bauen bin versucht, die keine Zeichen des Formats ersetzt:REGEX für Dezimalzahlen ersetzen

eine beliebige Anzahl von Ziffern, dann optional (Dezimalpunkt, eine beliebige Anzahl von Stellen)

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

ich verwende ereg_replace in pHP und in der Nähe von einer Arbeits regex ich es geschafft habe, ist

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

die fast, was ich brauchen, ist (außer es wird eine beliebige Anzahl von Dezimalstellen erlauben)

i.e. 
123.123.123a // 123.123.123 

mein nächster Versuch war

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 

aber dies scheint nur sonst ein beliebige Anzahl von Ziffern und nichts zu ermöglichen.

Bitte helfen

Dank

+0

ereg_ * Funktionen sind veraltet. Verwenden Sie stattdessen preg_ *. –

Antwort

8

diese Schritte versuchen:

  1. alle Zeichen entfernen, außer 0-9 und .
  2. entfernen Sie . hinter der ersten Dezimalstelle.

Hier ist eine Implementierung mit regulären Ausdrücken:

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

Und noch eines mit nur einem regulären Ausdruck:

$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

Danke, beide arbeiten wie ein Zauber - aus Interesse können Sie die "$ 1" und "$ 2" erklären - sind diese Backtrace's aus der Regex? (+1 upvote) – JimmyJ

+0

Ja, '$ 1' und' $ 2' sind Verweise auf die Übereinstimmung des '/^([0-9] * \.) (. *) /' -Musters. Das "e" Flag soll den Ersatz als auszuführenden Ausdruck behandeln und den Rückgabewert als Ersatz verwenden. Also wird "$ 1" .str_replace (".", "", "$ 2") '' ausgewertet und '$ 1' und' $ 2' werden durch die vorher gefundenen Werte ersetzt. – Gumbo

+0

Danke nochmal, ich denke, ich muss zur Regex-Schule gehen;) – JimmyJ

1

Dies sollte schneller sein, eigentlich. Und es ist viel lesbarer. ;-)

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

Danke, das funktioniert auch gut (+1 upvote) – JimmyJ