【问题标题】:Progressive validation of a date in JavascriptJavascript中日期的渐进式验证
【发布时间】:2023-03-22 07:21:01
【问题描述】:

我有这个日期模式:

var regexFormat = "\\d{2}-\\d{2}-\\d{4}"

每当用户按下一个键时,我必须检查插入的值是否“可能是”一个有效的日期。

例如如果用户按下 0、1,则“实时”验证器必须说“是的,它可能是日期”,而如果用户按下“a”,例如,验证器必须返回 false。

所以我的问题最终是:如何执行“部分”验证?

谢谢!

好的,所以不要被标记为离题,我用这个丑陋的尝试来“奖励”你解决我的问题:

_getDaysList: function (startingDate ,callback) {
    var that = this,
        currentDate = new Date(),
    partialDate = /^(\d(\d(-(\d(\d(-(\d(\d(\d(\d)?)?)?)?)?)?)?)?)?)?$/,
    partialYear = /^(\d(\d(\d(\d)?)?)?)?$/,
    partialMonth = /^(\d(\d)?)?$/,
    partialDay = /^(\d(\d)?)?$/,
    list = [];

    if (partialDate.test(startingDate)) {

        var counter = 0;
        while ( startingDate.length != 10 && counter <=5000) { 
            counter++;

            if (// And matches a specific date
                    that._startsWith(that._dateToString(currentDate),startingDate)) {

                // La data segue il parametro.
                list.push(that._dateToString(currentDate));
                if (that._isFunction(callback)) { 
                    callback(list); 
                }
                return;
            }
            currentDate = that._addDays(currentDate, -1);
        }
    }

    if (that._isFunction(callback)) { 
        callback(list); 
    }
    return list;
}

【问题讨论】:

    标签: javascript regex validation


    【解决方案1】:

    这有点难看,但这样的事情可能会起作用:

    var partialDate = /^(\d(\d(-(\d(\d(-(\d(\d(\d(\d)?)?)?)?)?)?)?)?)?)?$/;
    
    partialDate.test(""); //=> true
    partialDate.test("a") //=> false
    partialDate.test("1"); //=> true
    partialDate.test("12"); //=> true
    partialDate.test("12-a"); //=> false
    partialDate.test("12-2"); //=> true
    partialDate.test("12-25"); //=> true
    partialDate.test("12-25-2"); //=> true
    partialDate.test("12-25-2"); //=> true
    partialDate.test("12-25-20"); //=> true
    partialDate.test("12-25-201"); //=> true
    partialDate.test("12-25-201fooled you"); //=> false
    partialDate.test("12-25-2013"); //=> true
    partialDate.test("12-25-2013 is a holiday"); //=> false
    

    这只是围绕每个后续字符包装一个可选组。

    【讨论】:

    • 如你所说,丑陋但有效!
    【解决方案2】:

    您可以使用带有许多分组 OR 条件的长正则表达式。

    我会首先验证按键输入,因为您知道您的输入应该只是 \d 或 -,如果其他任何内容返回 false。

    然后,如果它通过了第一个输入验证,请将其与存储组合日期字符串的变量结合起来,并验证模式是否正确。我很懒,我敢肯定我可以想出一个可以捕获所有内容的正则表达式,但它只有 10 个字符,您可以检查日期字符串长度并根据长度和正确的模式进行验证。它使您可以灵活地处理错误通知。我在我的示例中使用 jquery。

      var date_string = "";
      $('input[type="date"]').keyup(function(){
            self = $(this).val();
            if(self.val().match(/(\\d|-)/){
                if(date_string.length() == 2 && date_string.match(regex_for_2_chars)){
                   date_string += self.val();
                }
                else if()....
    
            }
        });
    

    【讨论】:

    • 答案很好且正确,但我在多源和多字自动完成中使用它,所以不幸的是,预验证不是一个选项。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多