我有一些验证日期的代码如下:
function validateForm() { var errFound = 0; //var patt_date = new RegExp("^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))$"); var patt_date = new RegExp("^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$"); if (patt_date.test(document.getElementById("datefrom").value) == false){errFound = errFound + 1;document.getElementById("datefrom").className = "error";} if (errFound > 0) alert('Please correct red colored field!'); else return true; return false; }
以上代码应使用YYYY-MM-DD格式,但无法验证日期,例如"2009-02-29"
评论的代码应该工作(// var patt_date = new RegExp ...),它可以捕获"2009-02-29",
但是当我放入无效数据并尝试纠正它时它会破坏验证,它会一直抱怨某些东西在我纠正它们之后错误的表单值(特别是在具有多个输入的表单上)
也许有人可以修复当前的正则表达式?
测试了2009-02-29,第一个链接工作和第二个没有.再次问题是第二个正则表达式没有检测到值2009-02-29无效而第一个可以(但它毁了我的代码?所以它一定是有问题).
谢谢,
Dels
不要使用正则表达式进行整个日期验证,这确实推动了正则表达式设计的极限.我会建议这个程序:
检查日期与正则表达式 /^\d{4}-\d{2}-\d{2}$/
使用substr()
和转换为整数提取年,月和日
使用一些if
语句来验证整数.像这样:
if (month == 2) { if (day == 29) { if (year % 4 != 0 || year % 100 == 0 && year % 400 != 0) { // fail } } else if (day > 28) { // fail } } else if (month == 4 || month == 6 || month == 9 || month == 11) { if (day > 30) { // fail } } else { if (day > 31) { // fail }
(当然可以更简洁地编写)或者,您可以使用Javascript的Date
类执行此验证- 您可能需要执行诸如解析日期,将其转换回字符串以及检查两个字符串是否相等的操作.(我不是Javascript专家)