Regex - убрать нечисловые значения и убрать центы - PullRequest
8 голосов
/ 13 января 2011

Я сейчас работаю над проектом на PHP и мне нужна помощь Regex.Я хотел бы иметь возможность взять введенное пользователем денежное значение и убрать все нечисловые и десятичные разряды / центы.

Пример:

'2.000,00' до '2000'От $ 2.000,00 до 2000От 2abc000 до 2000От 2.000 до 2000

(я использую форматирование не в американской валюте)

Как я могу это сделать?Буду признателен за помощь - Спасибо

Ответы [ 4 ]

15 голосов
/ 13 января 2011

Вы можете сделать:

$str = preg_replace('/[^0-9,]|,[0-9]*$/','',$str); 
10 голосов
/ 13 января 2011
$output = preg_replace('/[^0-9]/s', '', $input);

, который должен заменить нечисловые символы пустыми строками.

0 голосов
/ 23 августа 2016

На стороне клиента я использую классы на входах:

$("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("");
}
0 голосов
/ 13 января 2011

Это должно делать то, что вы хотите.

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

Совпадение начнется, как только будет найдено первое число, и остановится, когда оно достигнет чего-то, что не является ни числом, ни точкой (т.е.запятая или конец строки в ваших примерах)

РЕДАКТИРОВАТЬ: забыл сначала удалить буквы внутри значения.

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

...