使用PHP中的java脚本验证AM / PM的12小时时间

时间:2013-07-22 22:19:37

标签: php javascript regex

我正在尝试验证时间

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

我正在考虑一些正则表达式,但没有成功验证时间。 我的java脚本函数是

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]$/;

让我在哪里出错?

3 个答案:

答案 0 :(得分:5)

试试这个

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  

答案 1 :(得分:2)

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

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

答案 2 :(得分:-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
 }