1

我想使用验证时间输入(如上午 10:30、下午 2:30)preg_match()

我用这个,

 $pattern   =   "/([1-12]):([0-5])([0-9])( )(am|pm|AM|PM)/";
 if(preg_match($pattern,$time)){
   return true;
 }

但是当我给出这样的输入时,10:30 pmxxxx它不会被验证。我不知道方法是否正确。请帮忙。

4

3 回答 3

7

日期时间解决方案

您可以使用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.
于 2012-10-06T12:07:52.357 回答
2

正则表达式中的[...]符号定义了字符类:应用于单个字符的东西。应该在这里使用它的替代:

0[1-9]|1[0-2]

...所以整个正则表达式看起来像这样:

/^(?:0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$/
于 2012-10-06T11:19:12.113 回答
1

正则表达式解决方案

  • [1-12]不起作用,因为这不是范围定义,而是意味着开始[] 结束字符类定义
  • 最后使用/i 模式修饰符,因此您不需要编写PM, pm, pM, Pm, AM, am, aM, Am组合。
  • PM 和 AM fetch 可以用[ap]m.
  • 如果您希望验证整个字符串,则该字符串必须从头到尾都是有效的^and $
  • 我在时间和 pm|am 之间添加了\h 转义序列(水平空白字符),因此 time like10: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
)
于 2012-10-06T11:46:29.957 回答