jquery:使用正则表达式验证两个规则失败

时间:2015-10-17 16:29:13

标签: javascript jquery regex

我试图为一个微小的验证系统创建一个jquery插件,所以我在我的函数中有这部分代码

   // prevent current form submitting
    this.on('submit',function(e){
        // remove classes from input when we focus on it 
        $(this).on('click','input,select',function(){
            $(this).removeClass(settings.class);
        });
        // prevent form from being submited
        e.preventDefault();
        // find all inputs 
        $(this).find('input,select').each(function() {
            if (!$(this).data('rules')) return;
            // get rules array from the attribute
            var rules = $(this).data("rules").split(" ");

            // foreach rules
            for(var i = 0; i < rules.length;i++){
                // check if the validation is true or attach the given class to the input
                if(validate( rules[i],$(this))){
                    // the validation is okey continue to the next rule
                    continue;
                }else{
                    // the validation is false , attach the class to the input and stop the loop
                    $(this).addClass(settings.class);
                    break;
                }
            }
        });
    });
    /* validation */
    function validate(rule,input){
        switch(rule){
            case  'email': return patterns.email.test(input.val()); break;
            case 'required': return patterns.required.test(input.val()); break;
            case 'url': return patterns.url.test(input.val()); break;
            case 'phone': return patterns.phone.test(input.val()); break;
            case 'confirmed':
            inputName = input.attr('name').split("_confirmation")[0];
            return (input.val() == $('input[name='+inputName+']').val() ? true : false);
            break;
            case /^min\:[0-9]+/.test(rule):
            length = rule.split('min:')[1];
            return (input.val().trim() >= length ? true : false);
            break;
            case rule.match(/^max\:[1-9]+/)[0]:
            length = rule.split('max:')[1];
            return (input.val().trim().length <= length ? true : false);
            break;
            case rule.match(/^exact\:[1-9]+/)[0]:
            length = rule.split('exact:')[1];
            return (input.val().trim().length == length ? true : false);
            break;
            default:
            return true;

        }
    }
    /* Patterns */
    var patterns = {
        email:/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,
        required:/^[\s\t\r\n]*\S+/,
        url:/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/,
        phone:/^[0-9]{10,10}$/,
    }

当我尝试使用此验证min验证两个输入时:length max:length 它返回rule.match(...)为null, 但是当我尝试使用min:length验证只有一个输入时,它可以正常工作。 有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

因为你的switchrulestring,您的案例陈述为regex。试试这个: -

/* validation */
function validate(rule,input){
    switch(rule){
        case 'email': return patterns.email.test(input.val()); break;
        case 'required': return patterns.required.test(input.val()); break;
        case 'url': return patterns.url.test(input.val()); break;
        case 'phone': return patterns.phone.test(input.val()); break;
        case 'confirmed':
        inputName = input.attr('name').split("_confirmation")[0];
        return (input.val() == $('input[name='+inputName+']').val() ? true : false);
        break;
        default:
            if(/^min\:[0-9]+/.test(rule)){
                length = rule.split('min:')[1];
                return (input.val().trim().length >= length ? true : false);
            }
            if(/^max\:[1-9]+/.test(rule)){
                length = rule.split('max:')[1];
                return (input.val().trim().length <= length ? true : false);
            }
            if(/^exact\:[1-9]+/.test(rule)){
                length = rule.split('exact:')[1];
                return (input.val().trim().length == length ? true : false);
            }
            return true;
    }
}

工作Fiddle

答案 1 :(得分:0)

问题是如果模式不匹配,rule.match(/^max\:[1-9]+/)[0]将导致错误。在这种情况下,.match()会返回null并且访问[0]会失败。

max:10在您的示例中不起作用的另一个原因是[1-9]没有包含0,因此10赢了&#39}。匹配。

对这两个问题的快速解决方法是将表达式更改为rule.match(/^(max\:[0-9]+)|.*/)[1]