我有一个输入字段,允许用户输入日期。
我需要此日期采用以下格式: 10Jan13 (大小写并不重要)
有一个弹出日历,如果使用,将为用户正确格式化日期。
我想使用Javascript检查输入onblur
的值,以确保用户没有粘贴或不正确地键入日期。
我目前正在检查仅限数字的字段:
var numbers = /^[0-9]+$/;
if (!BIDInput.value.match(numbers))
{
checkedInput.value = "";
alert('Not a number');
}
我正在检查这样的字母字段:
var letters = /^[a-z]+$/
if (!nameInput.value.match(letters))
{
nameInput.value = "";
alert('Not a letter');
}
如果可能的话,我想以类似的方式检查日期格式。但任何完成任务的事情都可以。有人能指出我如何完成这项工作的正确方向吗?
我知道客户端验证不会取代服务器端验证。这仅用于用户体验目的。
答案 0 :(得分:3)
你几乎拥有你拥有的东西。基本上你的格式是一个或两个数字,然后是12个可能的字符串之一,后跟两个数字。例如:
var shortDateRex = /^\d{1,2}(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\d{2}$/;
故障:
^
字符串的开头。
\d{1,2}
一位或两位数。
(:?...)
非捕获组。或者,如果您愿意,可以使用捕获组。
Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec
替换,允许这12个选项中的任何一个。当然,如果你愿意,你可以添加更多。如果您有两个以相同方式开始的选择(例如Jan
和January
),请在交替中提前选择较长的选项。
\d{2}
两位数。
旁注:原则上我不得不建议反对两位数的日期,特别是考虑到我们目前所处的世纪!
回应Amberlamps的评论,即这不会验证日期:一旦您验证了格式,如果您愿意,那么检查日期本身是微不足道的(排除{{1例如):
30Feb13
......或类似的东西。
或者,如果(像我一样)你不想看到重复的月份名称列表,你可以使用带有字符串的var validateDateString = (function() {
var monthNames = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec".toLowerCase().split("|");
var dateValidateRex = /^(\d{1,2})(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\d{2})$/i;
var arbitraryCenturyCutoff = 30;
function validateDateString(str) {
var match;
var day, month, year;
var dt;
match = dateValidateRex.exec(str);
if (!match) {
return false;
}
day = parseInt(match[1]);
month = monthNames.indexOf(match[2].toLowerCase()); // You may need a shim on very old browsers for Array#indexOf
year = parseInt(match[3], 10);
year += year > arbitraryCenturyCutoff ? 1900 : 2000;
dt = new Date(year, month, day);
if (dt.getDate() !== day ||
dt.getMonth() !== month ||
dt.getFullYear() !== year) {
// The input was invalid; we know because the date object
// had to adjust something
return false;
}
return true;
}
return validateDateString;
})();
构造函数,但你必须记住复制反斜杠:
RegExp
答案 1 :(得分:2)
您可以使用以下正则表达式来检查以2个数字开头的字符串,后跟3个字符,后跟2个数字
[0-9]{2}[a-zA-Z]{3}[0-9]{2}