Вы можете проверить входящие выражения времени и проверить наличие дополнительного начального нуля в шаблоне регулярных выражений. Нет необходимости совершать дополнительные strtotime()
звонки.
Код: ( PHP Demo ) ( Regex Demo )
$startTime = '19:00';
$endTime = '8:00';
if (!preg_match("~^(?|(2)\K[0-3]|([01]?)\K\d):[0-5]\d$~", $startTime, $start) ||
!preg_match("~^(?|(2)\K[0-3]|([01]?)\K\d):[0-5]\d$~", $endTime, $end) ||
(int)$start[1] . $start[0] > (int)$end[1] . $end[0]
) {
// var_export($start);
echo "\nTime Error\n";
// var_export(((int)$start[1] . $start[0]) . ' versus ' . ((int)$end[1] . $end[0]));
}
// outputs: Time Error
Приведенная выше методика использует шаблон, который захватывает цифру часа (необязательно, если сразу следует другая цифра), а затем перезапускает совпадение полной строки с \K
. «Сброс ветви» (|...|...)
используется, чтобы убедиться, что обе группы захвата рассматриваются как элемент [1]
в массиве совпадений. Делая начальную цифру необязательной, вы можете опустить третью ветку в исходном шаблоне. Кроме того, я предпочитаю более короткое значение \d
, чем [0-9]
.
Если это слишком запутанно для вас, вы можете также разрешить php сравнивать две строки как значения с плавающей запятой.
Код: ( PHP Demo )
if (!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $startTime) ||
!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $endTime) ||
str_replace(':', '.', $startTime) > str_replace(':', '.', $endTime)
) {
echo "\nTime Error\n";
// var_export(str_replace(':', '.', $startTime) . ' versus ' . str_replace(':', '.', $endTime));
}
И, конечно, вы можете безоговорочно применять отступы слева с нулями. (Как вы можете видеть, есть много способов снять кожу с этой кошки.)
if (!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $startTime) ||
!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $endTime) ||
str_pad($startTime, 5, 0, STR_PAD_LEFT) > str_pad($endTime, 5, 0, STR_PAD_LEFT)
) {
echo "\nTime Error\n";
// var_export(str_replace(':', '.', $startTime) . ' versus ' . str_replace(':', '.', $endTime));
}