日期验证年份失败
Year of date validation is failing
我需要进行日期验证才能接受 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 位有效输入?
您没有使用开始和结束分隔符来限制正则表达式,因此 12/12/200000
是一个匹配项,因为它与正则表达式匹配,然后是一些
if (!value.match(/^\d\d\/\d\d\/\d\d\d\d$/) )
作为旁注,您不必键入 \d
四次,您可以执行 \d{4}
来匹配 \d
的四个实例
问题出在 validate
函数中,它匹配的正则表达式允许输入您不想传递的有效值。除了明显的 dd/mm/yyyy
格式外,它还允许找到的文本位于字符串中的任何位置。基本上,你说要检查 "if there's said expression inside string",而它应该是 "if the whole string matches this expression"。
要解决此问题,请在开头添加 ^
并在结尾添加 $
。 ^
代表字符串开始,$
代表字符串结束:
/^\d\d\/\d\d\/\d\d\d\d$/
我认为阅读 documentation 了解 JavaScript 使用的正则表达式语法会对您有所帮助。
在 at 时,人类往往难以阅读类似字符的长重复序列,例如在您的正则表达式中。这个表达式更容易理解并且做的事情完全一样:
/^\d{2}\/\d{2}\/\d{4}$/
如果要通过创建日期对象来验证日期字符串,则无需检查整个模式,只需创建日期并检查结果即可。您真的需要两位数字来表示日期和月份吗?[=11=]
如果您想要 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
我需要进行日期验证才能接受 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 位有效输入?
您没有使用开始和结束分隔符来限制正则表达式,因此 12/12/200000
是一个匹配项,因为它与正则表达式匹配,然后是一些
if (!value.match(/^\d\d\/\d\d\/\d\d\d\d$/) )
作为旁注,您不必键入 \d
四次,您可以执行 \d{4}
来匹配 \d
问题出在 validate
函数中,它匹配的正则表达式允许输入您不想传递的有效值。除了明显的 dd/mm/yyyy
格式外,它还允许找到的文本位于字符串中的任何位置。基本上,你说要检查 "if there's said expression inside string",而它应该是 "if the whole string matches this expression"。
要解决此问题,请在开头添加 ^
并在结尾添加 $
。 ^
代表字符串开始,$
代表字符串结束:
/^\d\d\/\d\d\/\d\d\d\d$/
我认为阅读 documentation 了解 JavaScript 使用的正则表达式语法会对您有所帮助。
在 at 时,人类往往难以阅读类似字符的长重复序列,例如在您的正则表达式中。这个表达式更容易理解并且做的事情完全一样:
/^\d{2}\/\d{2}\/\d{4}$/
如果要通过创建日期对象来验证日期字符串,则无需检查整个模式,只需创建日期并检查结果即可。您真的需要两位数字来表示日期和月份吗?[=11=]
如果您想要 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