php检查时间格式与preg_match

时间:2014-08-28 06:22:55

标签: php regex

我想在php脚本中检查给定时间是否有这种格式:hh:mm使用正则表达式和preg_match。 我试过这个解决方案:

$time="12:59";
if(preg_match("/(2[0-3]|[01][0-9]):[0-5][0-9]/", $time)){print('right');}

但问题是,这个解决方案并不是真的正确,因为它也适用于xxxx12:59xxxx如何解决这个问题(它只看到前两个数字:和接下来的两个数字如何判断给定的时间应该有2个数字然后是2个数字?)

4 个答案:

答案 0 :(得分:3)

^(字符串的开头)和$(字符串的结尾)锚点添加到正则表达式。

if(preg_match("/^(2[0-3]|[01][0-9]):[0-5][0-9]$/", $time)) /*...*/

为了澄清,xxx12:59xxx通过OP的测试,因为preg_match返回字符串是否包含给定正则表达式的匹配,而不是整个字符串是否与给定的正则表达式匹配。要实现后一种行为,你的正则表达式只需要更具体,并使用字符串锚点的开头和结尾。

答案 1 :(得分:0)

尝试以下方法:

$time="12:59";
if(preg_match("/(1[012]|0[0-9]):[0-5][0-9]/", $time))
{
     // success validation
}

答案 2 :(得分:0)

12小时格式

preg_match("/(1[012]|0[0-9]):[0-5][0-9]/", $time);

24小时格式

preg_match("/(2[0-3]|[01][0-9]):[0-5][0-9]/", $time);

答案 3 :(得分:0)

您可以避免使用正则表达式并使用DateTime方法createFromFormat()。如果输入与格式不匹配,则返回false。

$time="12:59";
if(DateTime::createFromFormat('h:m', $time)) {
        echo 'right!';
}

如果您还需要24小时允许,您可以将其更改为:

if(DateTime::createFromFormat('h:m', $time) ||  
  (DateTime::createFromFormat('H:m', $time) && 
   !array_sum(DateTime::getLastErrors())
  ) {
        echo 'right!';
}

由于createFromFormat允许转换为24小时格式(所以24:30转换为00:30 + 1天),getLastErrors()检查是否发生了这种情况,因此在该情况下它仍会评估为假。