Подтвердить формат времени с помощью preg_match

Я хочу проверить ввод времени (например, 10:30, 02:30), используя preg_match()

Я использую это,

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

Но когда я даю вход, как 10:30 pmxxxx он не будет проверен. Я не знаю, является ли метод правильным или нет. Помоги пожалуйста.

Обозначение [...] в регулярных выражениях определяет класс символов : то, что применяется к одиночному символу. Здесь вместо этого следует использовать альтернативу:

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

… так что регулярное выражение в целом будет выглядеть так:

 /^(?:0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$/ 

DATETIME SOLUTION

Вы можете проверить все свои строки даты / времени с помощью 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-12] не будет работать, потому что это не определение диапазона, но [ и ] означает определение класса и начала символьного класса .
  • используйте модификатор /i шаблона в конце, поэтому вам не нужно писать PM, pm, pM, Pm, AM, am, aM, Am .
  • PM и AM выборка может быть проставлена ​​с помощью [ap]m .
  • если вы хотите проверить целую строку, то строка должна быть действительной от начала до конца с помощью ^ и $ .
  • Я добавил \h escape-последовательность (горизонтальный символ пробела) между временем и pm | am, поэтому время, подобное 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 )