J'essaie d'utiliser preg_match
pour valider qu'une entrée d'heure est dans ce format - "HH: MM"
Vous pouvez utiliser des expressions régulières pour vérifier cela.
pendant 12 heures:
preg_match("/^(?:1[012]|0[0-9]):[0-5][0-9]$/", $foo)
pendant 24 heures:
preg_match("/^(?:2[0-3]|[01][0-9]):[0-5][0-9]$/", $foo)
Si vous utilisez une horloge de 24 heures allant de 1: à 24:59, utilisez
preg_match("/^(?:2[0-4]|[01][1-9]|10):([0-5][0-9])$/", $foo)
Fonction simple qui valide une date (et/ou une heure) sans lever d'exceptions. Il prend le format de date attendu comme paramètre:
function isValidDate($date, $format = 'Y-m-d') {
$dateObj = DateTime::createFromFormat($format, $date);
return $dateObj && $dateObj->format($format) == $date;
}
Comment ça marche: il convertit la date d'entrée en un PHP DateTime
objet selon le $format
, compare ensuite cet objet à la date d'entrée d'origine. S'ils correspondent, la date est valide et a le format attendu.
Quelques exemples d'utilisation:
/* 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's not a valid date/time");
Imaginons que l'heure que vous souhaitez vérifier soit $timeStr
et doit être au format H:i
selon les spécifications de date. L'utilisation d'une expression régulière pour cela est stupide à mon humble avis. C'est tellement plus facile à lire:
MIS À JOUR
$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/>';
}
}
voici un code qui vérifie si la chaîne est une heure entre 00:00 et 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;
Pour un match de 12 heures qui peut se dérouler le matin et l'après-midi, utilisez ce
/^(1[0-2]|0?[1-9]):[0-5][0-9] (AM|PM)$/i
Il gérera 01h20 ou 01h20. Les exemples ci-dessus pour 12 heures étaient incorrects car vous pourriez potentiellement faire:
00:20
qui n'est pas un format valide de 12 heures.
Tu peux faire:
if(preg_match('/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/',$input)) {
// $input is valid HH:MM format.
}
En développant ce que @Toskan a écrit, vous pouvez le faire pour valider au format 00:00. Renvoie vrai si valide et entre 00:00 et 23:59.
Cela permet également d'utiliser différents formats d'heure ...
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}";
}
Fonction qui valide les heures, les minutes et les secondes, selon le format souhaité:
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 = validTime("25","H");
$valid = validTime("01:60","H:i");
$valid = validTime("01:20:61","H:i:s");
$valid = validTime("01:20:61");
Basé sur la réponse élégante de Charles avec une expression régulière. Si vous avez besoin d'une validation sur une ligne des deux "HH:MM"
et "H:MM"
(c'est à dire. "9:45"
/"09:45"
) utilisez l'expression rationnelle suivante pour correspondre au format 24 heures:
preg_match("/^(?(?=\d{2})(?:2[0-3]|[01][0-9])|[0-9]):[0-5][0-9]$/", $time)
(?
signifie sous-motif conditionnel , la syntaxe est:
(? ( condition ) motif oui | sans motif )
?=
dans la condition est la assertion regexp
?:
in yes-pattern is facultatif pour de meilleures performances et vous pouvez le supprimer. Cela signifie que nous n'avons pas besoin de capture entre parenthèses ()
, nous avons juste besoin de fonctionnalités alternatives.
Donc, nous décrivons simplement ce qui suit:
$time
la chaîne commence par deux chiffres (?=\d{2})
, utilisation (2[0-3]|[01][0-9])
modèle pour correspondre à la notation HH-heure ("09:45"
Cas)[0-9]
modèle pour correspondre à la notation des heures H ("9:45"
Cas)Comme on dit, la simplicité est la sœur d'un talent. Nous n'avons pas nécessairement besoin du modèle de condition décrit ci-dessus. La validation plus simple de "HH:MM/H:MM"
pour format 24 heures :
preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $time)
Encore, ?:
en regroupant les parenthèses ()
est facultatif pour désactiver la capture, vous pouvez le supprimer.
Donc, dans cette expression rationnelle, les sous-modèles alternatifs avec ()
essaie de faire correspondre deux chiffres de l'heure à la première (20..23
) et deuxieme (01..19
), puis un chiffre au dernier tiers (0..9
).
De plus, la validation de "HH:MM/H:MM"
pour format 12 heures :
preg_match("/^(?:0?[1-9]|1[012]):[0-5][0-9]$/", $time);
Ici, nous essayons de faire correspondre au premier chiffre (1..9
) avec possible zéro précédent (0?
), puis deux chiffres (10..12
).
Si vous cherchez des secondes (24h). Cela a fonctionné comme un charme pour moi.
$time = "23:59:60";
preg_match("/^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $time)
Réponse corrigée pour @Toskan si vous souhaitez uniquement valider la chaîne 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;
}
}
Si vous n'avez pas besoin de preg_match
, voici une autre nouvelle méthode:
$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 />";
}
Probablement pas la méthode la plus efficace au monde, mais elle le fait. Valable uniquement pour les périodes de 00:00
à 23:59
. Aussi, 8:0
valide comme un temps (en supposant que vous vouliez dire 08:00
).