【问题标题】:javascript regexp, validating date problemjavascript正则表达式,验证日期问题
【发布时间】:2010-10-14 06:01:45
【问题描述】:

我有一些验证日期的代码如下:


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”
但是当我输入无效数据并尝试更正它时,它会破坏验证,在我更正它们后它一直抱怨表单值有问题(尤其是在具有多个输入的表单上)

也许有人可以修复当前的正则表达式?


已编辑,我只想简单替换上述正则表达式,意思是新的正则表达式模式而不是验证日期的全新方法
作为参考,我只是从以下位置获取正则表达式模式:
http://www.regexlib.com/REDetails.aspx?regexp_id=694
http://www.regexlib.com/REDetails.aspx?regexp_id=933

2009-02-29 测试,第一个链接有效,第二个无效。再次问题是,只有第二个正则表达式没有检测到值 2009-02-29 无效,而第一个可以(但它破坏了我的代码?所以它一定有问题)。

谢谢,
德尔斯

【问题讨论】:

  • 你能举个例子说明第二个正则表达式应该匹配但不匹配的日期吗?此外,您的第一个(已注释掉的)正则表达式在闰日方面略有错误 - 它假设 1900 年是闰年,而实际上并非闰年。

标签: javascript regex validation


【解决方案1】:

不要使用正则表达式进行整个日期验证,这确实突破了正则表达式的设计极限。我建议改用这个程序:

  1. 对照正则表达式检查日期/^\d{4}-\d{2}-\d{2}$/
  2. 使用substr()提取年、月、日并转换为整数
  3. 使用一些if 语句来验证整数。像这样:
如果(月 == 2){ 如果(天 == 29){ 如果(年 % 4 != 0 || 年 % 100 == 0 && 年 % 400 != 0){ // 失败 } } 否则如果(天> 28){ // 失败 } } 否则 if (月 == 4 || 月 == 6 || 月 == 9 || 月 == 11) { 如果(天> 30){ // 失败 } } 别的 { 如果(天> 31){ // 失败 }

(当然可以写得更简洁)或者,您可以使用 Javascript 的 Date 类执行此验证 - 您可能需要执行解析日期、将其转换回字符串以及检查两者是否字符串相等。 (我不是 Javascript 专家)

【讨论】:

  • 你可以给用户一个有用的错误信息,比如:“二月只有XX天”。
  • 但我不是 JS Stuff 方面的专家……想不出还有什么比创建正则表达式更快速和简单的方法了,哈哈
  • 喜欢这种方法,但是需要稍微扩展一系列测试,所以还要测试月份的值。否则,值 '13/30/2012' 将是有效的。
【解决方案2】:

在这点上我有点同意 David 的观点... 正则表达式匹配不应该被用作决定通过的日期是否实际上有效的排他性标准。 Javascript 验证中的通常过程涉及几个步骤:

一个。第一步是通过匹配正则表达式来确保传递的字符串与 expected 日期格式匹配。以下可能是更严格的 Regex 模式。

// Assuming that the only allowed separator is a forward slash.
// Expected format: yyyy-mm-dd
/^[12][90][\d][\d]-[0-3]?[\d]-[01]?[\d]$/

b.第二步是将字符串解析为一个 Date 对象,该对象返回编号。自 1970 年以来的毫秒数。将此数字用作 Date 构造函数的参数。

c。由于 JS 会自动将传递的日期翻转到最接近的有效值,因此您仍然无法确定创建的 Date 对象是否与传递的对象匹配。要确定是否发生这种情况,最好的方法是根据分隔符拆分传递的字符串并比较各个日期组件:

// d is the created Date object as explained above.
var arrDateParts = inputDate.split("-");
if ((d.getFullYear() == arrDateParts[0]) && (d.getMonth() == arrDateParts[1]) && (d.getDate() == arrDateParts[2]))
  return true;
else
  return false;

【讨论】:

  • 嗨!在 c 部分的测试中,您应该在 d.getMonth() 中添加一个 - 返回值在 0-11 范围内,而 inputDate 的月份可能在 01-12 范围内。
【解决方案3】:

此 javascript 代码可准确验证日期。您可以复制它并在浏览器中进行测试。

 var regDate = '^(19[0-9]{2}|2[0-9]{3})-(0[1-9]{1}|1[0-2]{1}){1}-(0[1-9]|(1|2)[0-9]|3[0-1]){1}$';
 var txt='2010-01-31';
 if(txt.match(regDate))
 {
    alert('date match');
 }

【讨论】:

  • 日期为2010-02-31时无效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2013-05-03
  • 1970-01-01
  • 2011-05-16
  • 2013-04-22
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多