我想在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个数字?)
答案 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()
检查是否发生了这种情况,因此在该情况下它仍会评估为假。