0

我有一个允许用户输入日期的输入字段。

我需要此日期采用以下格式:10Jan13(大写不重要)

有一个弹出日历,如果使用它将为用户正确格式化日期。

我想onblur使用 Javascript 检查输入的值,以确保用户没有错误地粘贴或键入日期。

我目前正在检查这样的纯数字字段:

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');
}

如果可能,我想以类似的方式检查日期格式。但是完成任务的任何事情都会做。谁能指出我如何完成这项工作的正确方向?

我知道客户端验证不会取代服务器端验证。这仅用于用户体验目的。

4

2 回答 2

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交替,允许这十二种选择中的任何一种。当然,如果您愿意,您可以添加更多。如果您有两个以相同方式开始的选项(例如JanJanuary),请将较长的选项放在更早的交替中。

  • \d{2}两位数。


旁注:原则上,我不得不建议不要使用两位数的日期,尤其是考虑到我们目前所处的世纪!


回应 Amberlamps 的评论,即这不会验证日期:一旦您验证了格式,如果您愿意,就可以轻松检查日期本身(例如,排除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带有字符串的构造函数,但你必须记住复制你的反斜杠:

var monthNamesString = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";
var monthNames = monthNamesString.toLowerCase().split("|");
var dateValidateRex = new RegExp("^(\\d{1,2})(" + monthNamesString + ")(\\d{2})$", "i");

实例| 来源

于 2013-02-18T13:06:24.900 回答
2

您将使用以下正则表达式来检查以 2 个数字开头的字符串,后跟 3 个字符,后跟 2 个数字

[0-9]{2}[a-zA-Z]{3}[0-9]{2}
于 2013-02-18T13:10:01.330 回答