【问题标题】:Validate input for month验证月份的输入
【发布时间】:2015-12-28 08:12:31
【问题描述】:

我只想允许这种格式:19.30 Friday 2/10。那么 19:30 而不是 19.30 也是可以接受的。如何轻松做到这一点?请注意,使用全新代码的答案也将被接受。


这是我的尝试,但在月份部分失败了。 str 是我们尝试验证的字符串。

var ok = true, index = - 1;
for(var i = 0; i < str.length; ++i) {
  if(i == 0 || i == 1 || i == 3 || i == 4) {
    if(!$.isNumeric(str[i])) {
      ok = false;
      break;
    }
  }
  if(i == 2) {
    if(str[i] != '.' && str[i] != ':') {
      ok = false;
      break;
    }
  }
  if(i == 5) {
    if(str[i] != ' ') {
      ok = false;
      break;
    } else {
      ++whitespaces;
    }
  }
  if(i > 5 && index == -1) {
    if(!isLetter(str[i])) {
      if(str[i] == ' ') {
        ++whitespaces;
        index = i;
      } else {
        ok = false;
        break;
      }
    }
  }
}
for(var i = index + 1; i < str.length; ++i) {
  if(i == index + 1 || i == index + 2 || i == index + 4) {
    if(!$.isNumeric(str[i])) {
      ok = false;
      break;
    }
  } else {
      if(str[i] != '.' && str[i] != '/') {
      ok = false;
      break;
  }
 }
}

if(!ok || whitespaces != 2) {
   alertify.error("Bad format, match creation failed!");
   return;
}

【问题讨论】:

  • 这是一个字符串输入字段吗?
  • 我得到带有prompt @vittore 的字符串。
  • 你为什么不使用正则表达式?它会有点复杂,但不会那么复杂!
  • @QBernard 因为我不知道怎么做!但我愿意!您可以发布一个带有示例的答案吗?但是请让我学习,而不仅仅是复制代码!

标签: javascript string validation input


【解决方案1】:

我真的怀疑用户使用这样的输入字段是否方便,即使您在该字段上有一个掩码,我已经说过我看到了几种方法:

  • 使用正则表达式验证输入字段(最简单)

  • 使用任何输入框掩码插件(google - 有数百个)

  • (我更喜欢一个)对日期和时间使用常规控件(即 html5 日期等,或 jquery.ui 日期和时间输入)并将 javascript Date 对象格式化为所需的日期/时间格式。

另外,不要使用提示从用户那里获取数据,使用大量的 javascript 模式之一(jquery.ui、bootstrap 等各有一个)

示例正则表达式:(\d\d?):(\d\d?)\s(\w+)\s(\d\d?)/(\d\d?)

将 javascript Date 对象格式化为您的格式(为简单起见,使用 moment.js):

moment(myDate).format('hh:mm Do dd/MM')

还可以查看用于日期/时间输入的插件,例如 one

更新:为了澄清我的观点 - 我真的怀疑您要求的全部原因只是以这种格式获取日期,您将使用日期来做某事,这就是为什么您更好开始将日期作为日期,而不是一些格式化为匹配旧要求的字符串。鉴于您最好使用便于输入 Date 的 UI 控件,即 html5 日期输入,或任何执行相同操作的插件。这将使您能够使用之后的日期,并在需要时将其格式化为您想要的格式(例如使用 moment.js 进行高级格式化)

【讨论】:

  • 我已经在互联网上搜索了一些准备好的东西。但是,我发现了这种时尚的日期:time 15/05/2015。我希望这一天是可见的,这就是我回到原始解决方案的原因。
  • 我需要研究正则表达式(因为我只能假设你的例子是什么意思)和 Date 对象然后......
【解决方案2】:

这是一个正则表达式的解决方案,你只需要测试你的字符串是否匹配这个正则表达式:

正则表达式:

[0-9]{2}[\.:][0-9]{2} [A-Z][a-z]{4,7} ([0-2][0-9]|[3][01])\/(0[1-9]|1[12])

示例:

这是一个有效的片段:

var str = "19.30 Friday 2/10";
var regex= /[0-9]{2}[\.:][0-9]{2} [A-Z][a-z]{4,7} [0-9]\/[0-9]{2}/
if (str.match(regex)) {
  alert("String matched .");
} else {
  alert("String unmatched !!");
}

这正是你所需要的。

说明:

[0-9]{2}[\.:][0-9]{2} [A-Z][a-z]{4,7} [0-9]\/[0-9]{2}
  • [0-9]{2} 匹配两位数。
  • [\.:] 匹配 .:,正如 yopu 所说。
  • [0-9]{2} 是匹配.: 之后的第二部分(两位数)。
  • [A-Z][a-z]{4,7} 匹配日期名称:它以大写字母开头,然后我们期望从 47 字符,因为 Friday 是最短的,Wednesday 是最长的。
  • [0-9]\/[0-9]{2} 匹配 2/10 的最后一部分。

【讨论】:

  • 似乎有效,但为什么呢? :) 你看我可以只是 cp 代码,就是这样。但是,我没有研究过正则表达式。你能帮我学习吗?
  • @gsamaras 好的,你是对的。我用对整个正则表达式的正确解释编辑了我的帖子,正则表达式可以被优化,但只要你需要验证一个字符串,最简单的方法就是使用正则表达式。
  • 解释的很好!但是,我有一些问题。 [A-Z][a-z]{4,7},预计第一个字母为大写。然后我们期望 4 到 7 个小写字符。然而,星期五有 5 个大写字母。索引是否从零开始?但是我们在这里计算数量,不是吗?然后,关于[0-9]\/[0-9]{2},我们需要允许日/月格式,因此我们应该有[0-31]\/[1-12]?或者我错过了什么?当然,你应该得到一个 +1 的好解释!
  • 是的,你在星期五是对的,它应该是 {5-7},对于月份和日期,是的,我们需要 ([0-2][0-9]|[3][01])\/(0[1-9]|1[12]),这是 a live Example test,你会在那里找到所有解释,我正在编辑我的发布。
【解决方案3】:

一个简单的例子

var re = /^[0-2][0-9](\.|:)[0-5][0-9] ([a-z]*) [0-9]{1,2}\/[0-9]{1,2}$/;
// the regex above checks 
// if the first number is a valid hour (between 00 and 24), then . or :,
// a valid minute number between 00 and 59,
// if you have a space, then a string, another space,
// then a valid month (0 - 12)

// How to use ?
var text = "19.30 Friday 2/10";
console.log(re.test(text)) // return true

【讨论】:

  • 谢谢(你应该得到 +1),但我仍然需要一些指导。 * 是做什么的?
【解决方案4】:

以下正则表达式应该适合您:

如果 2/10 代表 2 月 10 日

/^([0-9]|1\d|2[0-3])[\.:]([0-9]|[1-5]\d)\s(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\s([0-9]|1[0-2])\/([0-9]|[12]\d|3[01])$/

如果 2/10 代表 10 月 2 日

/^([0-9]|1\d|2[0-3])[\.:]([0-9]|[1-5]\d)\s(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\s([0-9]|[12]\d|3[01])\/([0-9]|1[0-2])$/

正则解释:

  • JavaScript 中的正则表达式介于 // 之间
  • ^...$ 说,从头到尾,匹配里面给出的模式
  • () 内部是一个组,([0-9]|1\d|2[0-3]) 匹配 0 - 23。表达式表示匹配(0-9ORstarting with 1 and \d(any digit)ORa two digit number where 10th digit should be 2 and unit place should be between 0-3 inclusive
  • [\.:] - 下一个标记可能是 .:. 需要转义,因为它是正则表达式中的元字符并且匹配任何内容。
  • ([0-9]|[1-5]\d) - 你会知道这是什么,参考第一点。
  • \s 匹配单个空格
  • (Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday) 匹配内部的任何给定模式
  • ([0-9]|1[0-2])\/([0-9]|[12]\d|3[01]) 表示日期和月份。

对cmets开放

var input = ["19.30 Friday 2/10",
             "19.60 Friday 2/10",
             "1.32 Friday 2/10",
             "10.30 Sunday 2/10",
             "22.30 Monday 2/10",
             "19:30 Saturday 12/10",
             "19.30 Friday 14/10",
             "19.30 Friday 2/21",
             "19:1 March 10/10"         
            ];

var output = "";
for(var i = 0; i < input.length; i++) {
    output += (input[i] + " " + /^([0-9]|1\d|2[0-3])[\.:]([0-9]|[1-5]\d)\s(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\s([0-9]|[12]\d|3[01])\/([0-9]|1[0-2])$/.test(input[i]) + "<br/>")
}

document.write(output);

【讨论】:

  • 19.30 Friday 2/21 true 应该是错误的。在欧洲,我们有第二个操作数作为月份。所以它应该允许最多 12 个数字,而不是 21 个。但是,你根本没有解释正则表达式是如何工作的,我不知道正则表达式,因此我无法编辑。但是,您应该因为展示测试用例而获得 +1。
猜你喜欢
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2015-06-03
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多