带有preg_匹配的php检查时间格式

带有preg_匹配的php检查时间格式,php,regex,Php,Regex,我想在php脚本中使用regex和preg_match检查给定时间是否具有以下格式:hh:mm。 我尝试了这个解决方案: $time="12:59"; if(preg_match("/(2[0-3]|[01][0-9]):[0-5][0-9]/", $time)){print('right');} 但问题是,这个解决方案并不真正正确,因为它也适用于xxxx12:59xxxx。如何解决这个问题(它只看:前面的前两位数字,下两位数字如何判断给定的时间应该正好有2个数字,然后:然后是2个数字?添加^

我想在php脚本中使用regex和preg_match检查给定时间是否具有以下格式:hh:mm。 我尝试了这个解决方案:

$time="12:59";
if(preg_match("/(2[0-3]|[01][0-9]):[0-5][0-9]/", $time)){print('right');}
但问题是,这个解决方案并不真正正确,因为它也适用于xxxx12:59xxxx。如何解决这个问题(它只看:前面的前两位数字,下两位数字如何判断给定的时间应该正好有2个数字,然后:然后是2个数字?

添加
^
(字符串开头)和
$
(字符串末尾)锚定到正则表达式

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


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

尝试使用以下命令ng一:

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

preg_match("/(1[012]|0[0-9]):[0-5][0-9]/", $time);
preg_match("/(2[0-3]|[01][0-9]):[0-5][0-9]/", $time);
24小时制

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

您可以避免使用正则表达式并使用DateTime方法。如果输入与格式不匹配,则返回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()上的检查
检查是否发生这种情况,因此在该场景中,它的计算结果仍然为false。

阅读问题“直到最后,您的正则表达式将无法通过问题中概述的用例。阅读问题”直到最后,您的正则表达式将无法通过问题中概述的用例。
xxxx
是什么意思?@AvinashRaj任何字符,大概……您可以告诉我一个可能是,
123456:598753
@AvinashRaj是的,虽然OP输入了错误——问题给出的正则表达式实际上匹配
xxxx12:59xxxx
(不是
12xxxx:59xxxx
),我只是为OP修复了它。@fabriciomatté耶,很高兴注意:)在发布之前,没有检查其他ans。无论如何,这是正确的。请您进一步了解“^”和$great:)+1的用法,以便进行解释!这也是一个不错的选择,但对我来说并不奏效exp:
$time=“58:29”;如果(DateTime::createFromFormat('h:m',$time)| | DateTime::createFromFormat('h:m',$time)){echo'right!'}//output right
,则该方法似乎将24-99视为第二天的滚动。可能是一个bug,所以我创建了一个:使用变通方法进行更新,以避免溢出移位。12小时格式不需要额外检查。