使用Javascript检查特定格式的输入值

使用Javascript检查特定格式的输入值,javascript,regex,input,validation,Javascript,Regex,Input,Validation,我有一个允许用户输入日期的输入字段 我需要此日期采用以下格式:2013年1月10日(大写不重要) 有一个弹出式日历,如果使用,将为用户正确设置日期格式 我想使用Javascript检查输入onblur的值,以确保用户没有粘贴或键入不正确的日期 我目前正在检查以下仅限数字的字段: var numbers = /^[0-9]+$/; if (!BIDInput.value.match(numbers)) { checkedInput.value = ""; alert('Not a

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

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

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

我想使用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');
}
我只检查字母字段,如下所示:

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');
}
如果可能的话,我想以类似的方式检查日期格式。但只要能完成任务就行了。有人能给我指出正确的方向吗


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

您所拥有的几乎就是这样。基本上,您的格式是一个或两个数字,然后是12个可能字符串中的一个,然后是两个数字。例如:

var shortDateRex = /^\d{1,2}(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\d{2}$/;
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;
})();
细分:

  • ^
    字符串的开头

  • \d{1,2}
    一位或两位数字

  • (:?…)
    非捕获组。或者,如果您愿意,您可以使用捕获组

  • 1月| 2月| 3月| 4月| 6月| 7月| 8月| 9月| 10月| 11月| 12月
    。当然,如果您愿意,您可以添加更多。如果有两个选项以相同的方式开始(
    Jan
    Jan
    ),请将较长的一个选项放在替换项的前面

  • \d{2}
    两位数字


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


回应Amberlamps关于这不会验证日期的评论:一旦您验证了格式,如果您愿意,那么检查日期本身就很简单了(例如,排除
30Feb13
):

…或者类似的东西

|

或者,如果(像我一样)您不喜欢看到重复出现类似于月份名称列表的列表,您可以使用带有字符串的
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");

|

你所拥有的几乎都在那里。基本上,您的格式是一个或两个数字,然后是12个可能字符串中的一个,然后是两个数字。例如:

var shortDateRex = /^\d{1,2}(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\d{2}$/;
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;
})();
细分:

  • ^
    字符串的开头

  • \d{1,2}
    一位或两位数字

  • (:?…)
    非捕获组。或者,如果您愿意,您可以使用捕获组

  • 1月| 2月| 3月| 4月| 6月| 7月| 8月| 9月| 10月| 11月| 12月
    。当然,如果您愿意,您可以添加更多。如果有两个选项以相同的方式开始(
    Jan
    Jan
    ),请将较长的一个选项放在替换项的前面

  • \d{2}
    两位数字


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


回应Amberlamps关于这不会验证日期的评论:一旦您验证了格式,如果您愿意,那么检查日期本身就很简单了(例如,排除
30Feb13
):

…或者类似的东西

|

或者,如果(像我一样)您不喜欢看到重复出现类似于月份名称列表的列表,您可以使用带有字符串的
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");

|

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

[0-9]{2}[a-zA-Z]{3}[0-9]{2}

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

[0-9]{2}[a-zA-Z]{3}[0-9]{2}

但这不会验证有效的日期。@Amberlamps:OP说“我想检查日期格式…”(我的重点)。我不是在和你争论。我只是想让未来的访问者知道这个表达式不会验证日期。如果您已经使用
match
验证了字符串格式,您可以将不同的部分放在括号中,并使用返回值进行日期验证。@Amberlamps:没错,当然可以这样做。编辑:哦,我真的很想,因为有一位数的天数!!但这不会验证有效的日期。@Amberlamps:OP说“我想检查日期格式…”(我的重点)。我不是在和你争论。我只是想让未来的访问者知道这个表达式不会验证日期。如果您已经使用
match
验证了字符串格式,您可以将不同的部分放在括号中,并使用返回值进行日期验证。@Amberlamps:没错,当然可以这样做。编辑:哦,我真的很想,因为有一位数的天数!!