使用JavaScript在PHP中进行12小时制AM/PM时间的验证

3

我正在尝试验证时间

00:00 to 11:59 ends with AM OR PM

我正在尝试一些正则表达式,但是无法成功验证时间。 我的JavaScript函数如下:

function verifydata( incoming ) {
var re = (1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm);
if(incoming.time.value != '' && !incoming.time.value.match(re)) 
{
alert("Invalid time format: " + incoming.time.value);
}
}

它无法正常工作

我也尝试了这个,但还是不行

var re = /^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/;

let me where I am going wrong?


?i是什么意思?(另外,你知道(am|pm)只会匹配小写字母吗?)你的正则表达式无法匹配"00:00",因为它只允许"0:00"。 - Lee Meador
1
@Lee Meador:这是在PCRE(PHP使用的正则表达式库)中指定不区分大小写匹配的一种方式;然而,JavaScript不支持该功能。 - PleaseStand
@leemeador,我对正则表达式的知识不是很丰富...只是搜索并尝试了很多正则表达式...在(am|pm)的情况下,我们也可以添加(AM|PM)吗? - user2608523
@pleasestand,你能告诉我如何在JavaScript中使用它吗?还有其他方法吗? - user2608523
在JavaScript中,仍然可以进行不区分大小写的匹配(仅针对整个正则表达式),使用i标志(在结束斜杠后)。PHP PCRE也支持此功能。 - PleaseStand
显示剩余5条评论
3个回答

7

试试这个

function testTime( time ) {
  var regex = /^([0-1][0-9])\:[0-5][0-9]\s*[ap]m$/i;
  var match = time.match( regex );
  if ( match ) {
    var hour  = parseInt( match[1] );
    if ( !isNaN( hour) && hour <= 11 ) {
      return true;
    }
  }
  return false;
}

testTime( '12:00 AM' ); // false  
testTime( '11:59 PM' ); // true  
testTime( '00:00 AM' ); // true  
testTime( '00:00am' ); // true  
testTime( '10:00pm' ); // true  

2

JavaScript不支持(?i),但它支持i标志以启用对整个正则表达式的不区分大小写匹配。此外,在正则表达式字面量(而不是普通字符串字面量)中,当反斜杠用作元字符时,请勿转义反斜杠:

var re = /^(1[012]|[1-9]):[0-5][0-9]\s?(am|pm)$/i;

这是更好的答案,尽管与捕获组有点不一致... 一切都在演示中解释:http://regex101.com/r/oB7hJ2 - Firas Dib
原始代码已经不一致,但将\s放在自己不必要的组中。为了保持一致,只需在每个(后面添加?:即可。然后就不会有捕获组了。 - PleaseStand

-1

我不喜欢对所有事情都使用正则表达式,特别是对于数字范围,我不喜欢它们。

假设函数的编写方式有些侧重:

 // regex used for "high level" check and extraction
 // matches "hh:mmAM", "hh:mm", "hh:mm PM", etc
 var matches = inp.match(/^(\d\d):(\d\d)\s?(?:AM|PM)?$/)
 if (matches && matches.length == 3) {
   var h = parseInt(matches[1], 10)
   var m = parseInt(matches[2], 10)
   // range checks done in code after getting numeric value
   return h >= 1 && h <= 12 && m >= 0 && m <= 59
 } else {
   return false
 }

不工作了...什么也没有发生 :( - user2608523
在这种情况下,“什么也没发生”意味着“它返回了一个不正确的值”。我已经修复了代码,这是在使用matches时出现的错误。 - user2246674
我正在使用alert测试它..它进入了我的函数,但没有进入if或else部分。 - user2608523
@user2608523 看看最新的更新。我犯了双倍的错误,但是现在可以工作了。话虽如此,这并没有回答“为什么这不起作用”的问题;我只是提出正则表达式不需要被专门使用。你必须使用/i修饰符或者改变(?AM|PM)使其不区分大小写。或者,如果你允许更宽松的输入,请考虑:inp.match(/^(\d\d?):(\d\d)(?\D|$)/,它甚至不匹配任何尾随的AM、pm、a.m.或其他内容。 - user2246674
我正在使用incoming.time.value.match而不是inp.match,因为我的值来自名为time的文本框..这样做可以吗?还是我在犯错误? - user2608523
incoming.time.value是什么?它应该是一个字符串(不是null、undefined或其他任何东西)。如在fiddle中所见,它可以按预期使用一些给定的输入。 - user2246674

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接