匹配正则表达式中的固定格式数字和可选字符串

时间:2011-01-22 13:22:42

标签: php regex

正则表达新手!我想以HH:MM格式验证时间字符串,其中包含可选空格和AM或PM后缀。

示例: 10:30 10:30 AM 都有效。

这是我到目前为止失败的原因:

  $test = '12:34';
  if(!preg_match("/^\d{2}:\d{2}?\s(AM|PM)$/", $test))
  {
      echo "bad format!";
  }

此外,是否可以在同一个正则表达式中验证HH或MM值分别是< = 12和< = 60?

问候,本。

2 个答案:

答案 0 :(得分:3)

试试这个:

/^\d{2}:\d{2}(?:\s?[AP]M)?$/

此处最后一部分(?:\s?[AP]M)?是可选的,non-capturing group,可以以可选的空白字符开头,然后是AMPM

对于数字范围,请将\d{2}替换为(?:0\d|1[012]),将第二(?:[0-5]\d|60)替换为{{1}}。

答案 1 :(得分:0)

使用正则表达式匹配有效分钟和小时的替代方法,您可以捕获它们,然后使用比较运算符:

$test = '12:14';
if( preg_match("/^(\d{2}):(\d{2})(?:\s?AM|PM)?$/", $test,$m) &&
    $m[1] >= 0 && $m[1] < 12 &&  
    $m[2] >= 0 && $m[2] < 60) {
        echo "good format";
} else {
        echo "bad format!";
}