Подтвердить что ты не робот

Подтвердите этот формат - "ЧЧ: ММ"

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

4b9b3361

Ответ 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).