我想使用preg_match()
验证时间输入(例如上午10:30,下午02:30)
我用这个,
$pattern = "/([1-12]):([0-5])([0-9])( )(am|pm|AM|PM)/";
if(preg_match($pattern,$time)){
return true;
}
但是当我提供像10:30 pmxxxx
这样的输入时,它将无法验证。
我不知道方法是否正确。请帮助。
答案 0 :(得分:6)
您可以使用DateTime::createFromFormat验证所有日期/时间字符串:
function isTimeValid($time) {
return is_object(DateTime::createFromFormat('h:i a', $time));
}
foreach (['12:30 am', '13:30 am', '00:00 pm', '00:00 am', '12:30am', '15:50pm'] as $time) {
echo "Time '$time' is " . (isTimeValid($time) ? "" : "not ") . "valid.\n";
}
Time '12:30 am' is valid.
Time '13:30 am' is not valid.
Time '00:00 pm' is valid.
Time '00:00 am' is valid.
Time '12:30am' is valid.
Time '15:50pm' is not valid.
答案 1 :(得分:2)
正则表达式中的[...]
表示法定义了 character 类:应用于单个字符的内容。应该在这里使用它的替代:
0[1-9]|1[0-2]
...所以整体的正则表达式看起来像这样:
/^(?:0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$/
答案 2 :(得分:1)
[1-12]
无法使用,因为这不是范围定义,而是[
和]
means start and end character class definition。/i
pattern modifier,因此您无需撰写PM, pm, pM, Pm, AM, am, aM, Am
组合。[ap]m
。^
和$
的开头到结尾有效。 \h
escape sequence(水平空白字符),因此10:10am
之类的时间可以有效。$time = '10:30 am';
$pattern = '~^(0[0-9]|1[0-2]):([0-5][0-9])\h*([ap]m)$~i';
if (preg_match($pattern, $time, $m)) {
print_r($m);
return true;
}
Array
(
[0] => 10:30 am
[1] => 10
[2] => 30
[3] => am
)