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

标签 javascript regex input validation

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

我需要此日期采用以下格式: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');
}

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

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

最佳答案

你已经拥有你所拥有的一切了。基本上,您的格式是一位或两位数字,然后是 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 的评论,即这不会验证日期:一旦您验证了格式,如果您愿意的话,检查日期本身就很简单了(以排除 例如,2013 年 2 月 30 日):

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

...或者类似的东西。

Live Example | Source

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

Live Example | Source

关于javascript - 使用 Javascript 检查输入值的特定格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14937044/

相关文章:

javascript - jQuery 嵌套循环

javascript - 为什么有些 JavaScript 构造函数不是函数?

javascript - 如果单击网格/表格的新行,则尝试删除 div

javascript - 正则表达式匹配当前 URL 中的字符串(包括通配符)

c# - 8 到 10 位数字的正则表达式

javascript - 如果使用 Javascript 选择复选框,如何要求输入字段?

c - 使用 C 识别等差

javascript - 上传前查看从客户端文件系统中选择的图像?

javascript - 正则表达式匹配多个 ;任意两个随机单词之间 Google 表格

jquery - 使用 jQuery 对 Select 字段进行排序