【问题标题】:check input value for specific format using Javascript使用 Javascript 检查特定格式的输入值
【发布时间】:2013-02-18 13:03:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript regex input validation


    【解决方案1】:

    你几乎已经拥有你所拥有的。基本上你的格式是一个或两个数字,然后是 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;
    })();
    

    ...或类似的东西。

    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

    【讨论】:

    • 但这不会验证有效日期。
    • @Amberlamps:OP 说“我想检查日期格式...”(我的重点)。
    • 我不是在和你争论。我只是把这条评论留给任何未来的访问者,让他们知道这个表达式不会验证日期。
    • 如果您已经使用match 验证了字符串格式,您可以将不同的部分放在括号中,并使用返回值进行日期验证。
    • @Amberlamps:确实如此,当然可以做到。 编辑:哦,还有我真的很想,允许一位数天怎么办!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多