подтвердите этот формат – «ЧЧ: ММ»

Я пытаюсь использовать preg_match для проверки того, что ввод времени находится в этом формате – «HH: MM»

preg_match("/(1[012]|0[0-9]):([0-5][0-9])/", $foo) 

для 12-часового или

 preg_match("/(2[0-3]|[01][0-9]):([0-5][0-9])/", $foo) 

на 24 часа.

Если вы используете 24-часовые часы, идущие с 01:00 до 24:59, используйте

 preg_match("/(2[0-4]|[01][1-9]|10):([0-5][0-9])/", $foo) 

Представим себе время, которое вы хотите проверить, это $timeStr и должно быть форматом H:i соответствии с спецификациями даты. Использование регулярного выражения для этого является ИМХО глупым. Это гораздо легче читать:

ОБНОВЛЕНО

 $timeStr = " 02:00"; //example of valid time, note whitespace test($timeStr); $timeStr = "23:59"; //valid test($timeStr); $timeStr = "24:00"; //invalid test($timeStr); $timeStr = "25:00"; //invalid test($timeStr); $timeStr = "16:61"; // invalid test($timeStr); //tests 23:59 hour format function test($timeStr){ $dateObj = DateTime::createFromFormat('dmY H:i', "10.10.2010 " . $timeStr); if ($dateObj !== false && $dateObj && $dateObj->format('G') == intval($timeStr)){ //return true; echo 'valid <br/>'; } else{ //return false; echo 'invalid <br/>'; } } 

Ты можешь сделать:

 if(preg_match('/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/',$input)) { // $input is valid HH:MM format. } 

вот код, который проверяет, является ли строка часом между 00:00 и 23:59

 $checked = false; if (preg_match('/^\d{2}:\d{2}$/', $str)) { if (preg_match("/(2[0-3]|[0][0-9]|1[0-9]):([0-5][0-9])/", $str)) { $checked = true; } } var_dump($checked );die; 

Для 12-часового матча, который может выполнять am и pm, используйте это

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

Он будет обрабатывать 01:20 или 1:20. Приведенные выше примеры в течение 12 часов были неправильными, поскольку вы могли бы сделать это:

 00:20 

который не является допустимым 12-часовым форматом.

Если вам не preg_match , вот еще один новый метод:

 $thetime = "20:15" // set the time $timecheck = explode(":", filter_var($thetime, FILTER_SANITIZE_URL)); $hourvalid = $minvalid = false; if (count($timecheck) > 1 && count($timecheck) < 4) { $hourvalid = ((abs(filter_var($timecheck[0], FILTER_SANITIZE_NUMBER_INT)) < 24) && (abs(filter_var($timecheck[0], FILTER_SANITIZE_NUMBER_INT)) === (INT) $timecheck[0])) ? true : false; $minvalid = ((abs(filter_var($timecheck[1], FILTER_SANITIZE_NUMBER_INT)) < 60) && (abs(filter_var($timecheck[1], FILTER_SANITIZE_NUMBER_INT)) === (INT) $timecheck[1])) ? true : false; } if ($hourvalid && $minvalid) {//valid time echo $thetime . " is a valid time<br />"; } else {//invalid time echo $thetime . " is NOT a valid time<br />"; } 

Вероятно, это не самый эффективный метод в мире, но это делается. Действует только на время с 00:00 до 23:59 . Кроме того, 8:0 проверяется как время (при условии, что вы означаете 08:00 ).

Развернувшись на том, что написал @Toskan, вы можете сделать это для подтверждения в формате 00:00. Возвращает true, если действует, и между 00:00 и 23:59.

Это также позволяет использовать различные форматы времени …

 function isTimeValid($time_str, $format = 'H:i') { $DateTime = \DateTime::createFromFormat( "d/m/Y {$format}", "10/10/2010 {$time_str}" ); return $DateTime && $DateTime->format( "d/m/Y {$format}" ) == "10/10/2010 {$time_str}"; } 

Исправленный ответ для @Toskan, если вы хотите только проверить строку HH: MM

  protected function isValidTime($timeStr){ $dateObj = DateTime::createFromFormat('dmY H:i', "10.10.2010 " . $timeStr); $dateObjOffset = DateTime::createFromFormat('dmY H:i', "10.10.2010 " . '24:00'); if($dateObjOffset <= $dateObj){ return false; } if ($dateObj !== false) { return true; } else{ return false; } } 

Простая функция, которая проверяет дату (и / или время), просто передавая формат, который вы ожидаете:

 function isValidDate($date, $format = 'Ym-d') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } /* Valid Examples: */ isValidDate("2017-05-31"); isValidDate("23:15:00", 'H:i:s'); isValidDate("2017-05-31 11:15:00", 'Ymd h:i:s'); /* Unvalid: */ isValidDate("2012-00-21"); isValidDate("25:15:00", 'H:i:s'); isValidDate("Any string that's not a valid date/time"); 

Основываясь на элегантном ответе Чарльза с регулярным выражением. Если вам нужна проверка одной строки как "HH:MM" и "H:MM" (т.е. "9:45" / "09:45" ), используйте следующее regexp для соответствия 24-часовому формату:

 preg_match("/^(?(?=\d{2})(?:2[0-3]|[01][0-9])|[0-9]):[0-5][0-9]$/", $time) 

объяснение

(? обозначает условный подшаблон , синтаксис:

(? ( условие ) yes-pattern | no-pattern )

?= в условии является регулярным выражением

?: в yes-pattern необязательно для лучшей производительности, и вы можете отказаться от него. Это означает, что нам не нужно фиксировать в круглых скобках () , нам нужна только альтернатива.

Итак, мы просто описываем следующее:

  1. Если строка $time начинается с двух цифр (?=\d{2}) , используйте (2[0-3]|[01][0-9]) шаблон для соответствия нотации HH-часа (случай "09:45" )
  2. в противном случае используйте шаблон [0-9] для соответствия нотации H-hour (случай "9:45" )

ОБНОВИТЬ

Как говорится, простота – это сестра таланта. Нам не обязательно нужен шаблон условий, описанный выше. Более простая проверка "HH:MM/H:MM" для 24-часового формата:

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

Опять ?: В группировке скобок () необязательно отключить захват, вы можете его удалить.

Таким образом, в этом регулярном выражении альтернативные подшаблоны, содержащие () , пытаются 20..23 два цифры часа с первым ( 20..23 ) и вторым ( 01..19 ) 01..19 , затем одна цифра на последней третьей ( 0..9 ).

Кроме того, проверка "HH:MM/H:MM" для 12-часового формата:

 preg_match("/^(?:0?[1-9]|1[012]):[0-5][0-9]$/", $time); 

Здесь мы сначала пытаемся сопоставить одну цифру ( 1..9 ) с возможным предыдущим нулем ( 0? ), А затем две цифры ( 10..12 ).