2011-01-13 3 views
8

Ich arbeite derzeit an einem Projekt in PHP und ich brauche einige Regex-Hilfe. Ich möchte in der Lage sein, einen vom Benutzer eingegebenen Geldwert zu verwenden und alle nicht numerischen und Dezimalstellen/Cents zu entfernen.Regex - Strip nicht numerisch und entfernen Cent wenn

Ex:

'2.000,00' auf '2000'
'$ 2.000,00' auf '2000'
'2abc000' auf '2000'
'2,000' bis 2000

(Ich verwende nicht US-Währung Formatierung)

Wie kann ich das tun? Ich würde die Hilfe zu schätzen wissen - Danke

Antwort

14

Sie tun können:

$str = preg_replace('/[^0-9,]|,[0-9]*$/','',$str); 
10
$output = preg_replace('/[^0-9]/s', '', $input); 

, die nicht numerische Zeichen durch leere Zeichenfolgen ersetzen sollte.

+0

Wie würde ich den Cent entfernen? So dass 2.000,00 nicht 200000 werden? – RS7

+0

@ RS7: bevor Sie tun, was dqhendricks zeigt, müssen Sie nur "strpos" des Kommas (,), dann erhalten Teilstring an diese Position. –

+0

preg_replace ('/,.+$/ s', '', $ input) – dqhendricks

0

Dies sollte tun, was Sie wollen.

$your_string_without_letters = preg_replace('\w+', '', $your_string) 
preg_match('[0-9][0-9.]*', $your_string_without_letters, $matches); 
$clean_string = $matches[0]; 

Das Spiel wird so schnell wie die erste Nummer gefunden wird, starten und stoppen, wenn es etwas trifft, die weder eine Zahl noch ein Punkt ist (dh. Ein Komma oder das Ende der Zeichenfolge in Ihren Beispielen)

EDIT: vergessen, die Buchstaben innerhalb des Wertes zuerst zu entfernen.

(nur eine persönliche Meinung, aber wenn ein Benutzer chracters schreibt, die keine Zahlen sind, Punkte, Kommas oder Währungssymbole ich den Eingang, anstatt sie zu reinigen versuchen, sich weigern würde)

0

auf der Clientseite I-Klassen an den Eingängen verwenden:

$("input.intgr").keyup(function (e) { // Filter non-digits from input value. 
    if (/\D/g.test($(this).val())) $(this).val($(this).val().replace(/\D/g, '')); 
}); 
$("input.nmbr").keyup(function (e) { // Filter non-numeric from input value. 
    var tVal=$(this).val(); 
    if (tVal!="" && isNaN(tVal)){ 
     tVal=(tVal.substr(0,1).replace(/[^0-9\.\-]/, '')+tVal.substr(1).replace(/[^0-9\.]/, '')); 
     var raVal=tVal.split(".") 
     if(raVal.length>2) 
      tVal=raVal[0]+"."+raVal.slice(1).join(""); 
     $(this).val(tVal); 
    } 
}); 
$("input.money").keyup(function(){ money($(this)) }) 
    .blur(function(){ money($(this),1); }); 
//----------- free-standing functions -------------- 
function money($inElem,inBlur,inDec){//enforces decimal - only digits and one decimal point. inBlur bool for final slicing to sets of 3 digits comma delimted 
    var isBlur=inBlur||0;//expects boolean (true/false/0/1 all work), default to 0 (false) 
    var dec=inDec || 2; 
    if(/[^,.0-9]/g.test($inElem.val()))//if illegal chars, remove and update 
     $inElem.val($inElem.val().replace(/[^,.0-9]/g, "")); 
    var ra=$inElem.val().split("."); 
    if(ra.length>2 || ra.length>1 && ra[ra.length-1].length>2){//if too more than 1 "." or last segment more than dec digit count, fix and update 
     if(ra[ra.length-1].length>2) ra[ra.length-1]=ra[ra.length-1].substr(0,dec);//shorten last element to only dec digit count 
     $inElem.val(ra.slice(0,ra.length-1).join("")+"."+ra[ra.length-1]);//glom all but last elem as single, concat dec pt and last elem 
    } 
    if(inBlur){ 
     ra=$inElem.val().split("."); 
     var rvsStr=zReverse(ra[0].replace(/,/g,"")); 
     var comDelim=""; 
     while(rvsStr.length>0){ 
      comDelim+=rvsStr.substr(0,3)+","; 
      rvsStr=rvsStr.substr(3); 
     } 
     $inElem.val(zReverse(comDelim).substr(1)+(ra.length==2?"."+ra[1]:"")); 
    } 
} 
function zReverse(inV){//only simple ASCII - breaks "foo bar mañana" 
    return inV.split("").reverse().join(""); 
} 
Verwandte Themen