Javascript 验证每月的输入

Javascript 验证每月的输入,javascript,string,validation,input,Javascript,String,Validation,Input,我只允许这种格式:19.30星期五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])) {

我只允许这种格式:19.30星期五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;
}
var ok=true,index=-1;
对于(变量i=0;i5&&index=-1){
如果(!Isleter(str[i])){
如果(str[i]=''){
++空白;
指数=i;
}否则{
ok=假;
打破
}
}
}
}
对于(变量i=索引+1;i
我真的怀疑用户使用这样的输入字段是否方便,即使您在字段上有一个掩码,我已经说过我看到了几种方法:

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

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

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

另外,不要使用提示符从用户那里获取数据,使用无数javascript模型中的一个(jquery.ui、bootstrap等,每个都有一个)

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

将javascript日期对象格式化为您的格式(为简单起见,请使用矩.js):

还可以看看用于日期/时间输入的插件,如下所示


更新:为了澄清我的观点,我真的怀疑您的要求的全部原因仅仅是为了以这种格式获取日期,您将使用日期来表示某些内容,这就是为什么您最好开始将日期作为日期,而不是将某些字符串格式化以满足遗留要求的原因。考虑到你最好使用UI控件来方便日期的输入,比如html5日期输入,或者任何做同样事情的插件。这将使您能够在之后处理日期,如果需要,将其格式化为所需格式(例如,使用moment.js进行高级格式化)

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

Regex:

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

[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星期五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)){
警报(“字符串匹配”);
}否则{
警报(“字符串不匹配!!”;
}
一个简单的例子

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

以下正则表达式应适用于您:

如果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-9
    以1和\d(任意数字)开头
    两位数字,其中第10位数字应为2,单位位置应在0-3之间(包括0-3)
  • [\.:]
    -下一个标记可以是
    需要转义,因为它是正则表达式中的元字符,与任何内容都匹配
  • ([0-9]|[1-5]\d)
    -参考第一点,您将知道这是什么
  • \s
    匹配单个空白
  • (星期日|星期一|星期二|星期三|星期四|星期五|星期六)
    匹配其中的任何给定模式
  • 日期和月份的
    ([0-9]|1[0-2])\/([0-9]|[12]\d|3[01])
公开征求意见

var input=[“19.30周五2/10”,
“19.60 2010年2月2日星期五”,
“1.32 2010年2月2日星期五”,
“10月2日星期日10:30”,
“2010年2月2日星期一22:30”,
“10月12日星期六19:30”,
“10月14日星期五19:30”,
“21月2日星期五19:30”,
“2010年3月10日19:1”
];
var输出=”;
对于(变量i=0;i
}

文件写入(输出)
这是一个字符串输入字段吗?我用
提示符
@vittore获取字符串。为什么不使用正则表达式?这将是一个有点复杂,但没有那么多@因为我不知道该怎么做!但是我想!你能给出一个答案并举例说明吗?但是,请让我学习,而不仅仅是复制代码!我在网上搜索了一些现成的东西。然而,我发现了这种时尚的日期:
时间2015年5月15日
。我希望这一天是可见的,这就是我回到原始解决方案的原因。我需要研究正则表达式(因为我只能假设你的示例的意思)和Date对象,然后…似乎可以工作,但为什么?:)你看,我只需要cp代码就可以了。然而,我没有学习正则表达式。你能帮我学习吗?@gsamaras好的,你说得对。我编辑了我的文章,对当时的整个正则表达式进行了正确的解释,正则表达式可以优化,但非常敏锐