日期验证失败

时间:2015-01-24 07:47:05

标签: javascript regex validation

我需要进行日期验证,以dd / mm / yyyy格式接受它。但是,所有条件都正常工作,除非我输入6位数的年份,它也接受它,如 -

12/12/200000

根据我的代码是有效的。以下是我的代码:

function validate(value) {
            if(!value.match(/\d\d\/\d\d\/\d\d\d\d/))
                return false;
            return checkdate(value);
}

function checkdate(val)
{
    var dates = val.split(/\D/);
    if(dates[0] <= 0 || dates[0] > 31)
        return false;
    if(dates[1] <= 0 || dates[1] > 12)
        return false;
    var now = new Date(dates[2],dates[1]-1,dates[0]);
    if (isNaN(now))
        return false;
    now.setHours(0,0,0,0);
    if (now.getFullYear() == dates[2] && now.getMonth() + 1 == dates[1] && now.getDate() == dates[0])
        return true;
    return false;
}

我不确定为什么它允许年份作为6位有效输入?

3 个答案:

答案 0 :(得分:2)

问题出在validate函数中,它匹配的正则表达式允许您不希望传递的输入值有效。除了明显的dd/mm/yyyy格式外,它还允许找到的文本在字符串中的任何位置。基本上,你说要检查“是否在字符串中有表达式”,当它应该是“如果整个字符串匹配这个表达式”。

要解决此问题,请在开头添加^,在结尾添加$^代表字符串开头,$代表字符串结尾:

/^\d\d\/\d\d\/\d\d\d\d$/

我认为您可以通过阅读JavaScript使用的正则表达式语法documentation来获益。

在此时,人类倾向于阅读类似字符的长重复序列,例如正则表达式。这个表达式更容易理解,并完全相同:

/^\d{2}\/\d{2}\/\d{4}$/

答案 1 :(得分:1)

你不是用开始和停止分隔符限制正则表达式,所以12/12/200000是匹配正则表达式的匹配,然后是一些

if (!value.match(/^\d\d\/\d\d\/\d\d\d\d$/) )

作为旁注,您不必输入\d四次,您可以\d{4}匹配\d的四个实例

答案 2 :(得分:0)

如果要通过创建Date对象来验证日期字符串,则无需检查整个模式,只需创建和日期并检查结果。你真的需要两位数的日期和月份数字吗?

如果你想要一个4位数的年份,必须单独检查,因为构造函数会愉快地将两位数年份转换为20世纪。如果确实需要两位数的日期和月份,那么可以与年份同时检查:

function validateDMY(s) {
  var b = s.split(/\D/);
  var d = new Date(b[2], --b[1], b[0]);
  return d && /^\d{4}$/.test(b[2]) && b[1] == d.getMonth();
}

console.log(validateDMY('30/02/2015')); // false
console.log(validateDMY('30/22/2015')); // false
console.log(validateDMY('02/02/15'));   // false
console.log(validateDMY('30/01/2015')); // true