我需要进行日期验证,以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位有效输入?
答案 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