Я пытаюсь использовать preg_match
для проверки того, что ввод времени находится в этом формате - "HH: MM"
Подтвердите этот формат - "ЧЧ: ММ"
Ответ 1
Вы можете использовать регулярные выражения для проверки этого.
на 12 часов:
preg_match("/^(?:1[012]|0[0-9]):[0-5][0-9]$/", $foo)
на 24 часа:
preg_match("/^(?:2[0-3]|[01][0-9]):[0-5][0-9]$/", $foo)
Если вы используете 24-часовые часы, идущие с 01:00 до 24:59, используйте
preg_match("/^(?:2[0-4]|[01][1-9]|10):([0-5][0-9])$/", $foo)
Ответ 2
Представьте себе время, которое вы хотите проверить, $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('d.m.Y 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/>';
}
}
Ответ 3
Простая функция, которая проверяет дату (и/или время) без исключения. Он принимает ожидаемый формат даты в качестве параметра:
function isValidDate($date, $format = 'Y-m-d') {
$dateObj = DateTime::createFromFormat($format, $date);
return $dateObj && $dateObj->format($format) == $date;
}
Как это работает: он преобразует введенную дату в объект PHP DateTime
в соответствии с переданным $format
, затем сравнивает этот объект с исходной датой ввода.
Если они совпадают, дата действительна и имеет ожидаемый формат.
Некоторые примеры использования:
/* Valid Examples: */
isValidDate("2017-05-31");
isValidDate("23:15:00", 'H:i:s');
isValidDate("2017-05-31 11:15:00", 'Y-m-d h:i:s');
/* Invalid: */
isValidDate("2012-00-21");
isValidDate("25:15:00", 'H:i:s');
isValidDate("Any string that not a valid date/time");
Ответ 4
вот код, который проверяет, является ли строка часом между 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;
Ответ 5
Вы можете сделать:
if(preg_match('/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/',$input)) {
// $input is valid HH:MM format.
}
Ответ 6
Для 12-часового матча, который может выполнять am и pm, используйте этот
/^(1[0-2]|0?[1-9]):[0-5][0-9] (AM|PM)$/i
Он будет обрабатывать 01:20 или 1:20. Приведенные выше примеры в течение 12 часов были неправильными, поскольку вы могли бы сделать это:
00:20
который не является допустимым 12-часовым форматом.
Ответ 7
Развернувшись на том, что написал @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}";
}
Ответ 8
Если вам не требуется 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
).
Ответ 9
Исправленный ответ для @Toskan, если вы хотите только проверить строку HH: MM
protected function isValidTime($timeStr){
$dateObj = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . $timeStr);
$dateObjOffset = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . '24:00');
if($dateObjOffset <= $dateObj){
return false;
}
if ($dateObj !== false) {
return true;
}
else{
return false;
}
}
Ответ 10
Основываясь на элегантном ответе Чарльза с регулярным выражением. Если вам нужна проверка одной строки как "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 является необязательным для повышения производительности, и вы можете его удалить. Это означает, что нам не нужен захват в круглых скобках ()
, нам нужна только альтернатива.
Итак, мы просто описываем следующее:
- Если строка
$time
начинается с двух цифр(?=\d{2})
, используйте шаблон(2[0-3]|[01][0-9])
для соответствия нотации HH-часа ("09:45"
) - используйте шаблон
[0-9]
для соответствия нотации H-hour ("9:45"
case)
UPDATE
Как говорится, простота - это сестра таланта. Нам не обязательно нужен шаблон условий, описанный выше. Более простая проверка "HH:MM/H:MM"
для 24-часового формата:
preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $time)
Опять же, ?:
в группировке круглых скобок ()
является необязательным для отключения захвата, вы можете его удалить.
Итак, в этом регулярном выражении альтернативные подшаблоны, содержащие ()
, пытаются сопоставить две цифры часа с первой (20..23
) и второй (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
).
Ответ 11
Если вы ищете секунды (24 часа). Это работало как прелесть для меня.
$time = "23:59:60";
preg_match("/^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $time)
Ответ 12
Функция, которая проверяет часы, минуты и секунды в соответствии с требуемым форматом:
function validTime($time, $format='H:i:s') {
$d = DateTime::createFromFormat("Y-m-d $format", "2017-12-01 $time");
return $d && $d->format($format) == $time;
}
Как использовать:
$valid = validTime("23","H");
$valid = validTime("23:59","H:i");
$valid = validTime("23:59:59","H:i:s");
$valid = validTime("23:59:59");
valid = true
$valid = validTime("25","H");
$valid = validTime("01:60","H:i");
$valid = validTime("01:20:61","H:i:s");
$valid = validTime("01:20:61");
valid = false
Ответ 13
Другой подход без использования регулярных выражений.
if(is_string($foo) && (strlen($foo) == 4 || strlen($foo) == 5) && intval(str_replace(':','',$foo)) > -1 && intval(str_replace(':','',$foo)) < 2360){
stuff to do if valid time
}
else{
stuff to do if invalid time
}
Прежде всего, я проверяю, является ли тип данных строкой. Если не очевидно, что это недействительное время. Затем я проверяю, имеет ли строка правильную длину в 4/5 буквы. С str_replace я удаляю ':', а затем передаю результат целому числу, которое я могу легко сравнить с желаемым временным диапазоном (в моем примере 00:00 - 23:59).