web-dev-qa-db-fra.com

valider ce format - "HH: MM"

J'essaie d'utiliser preg_match pour valider qu'une entrée d'heure est dans ce format - "HH: MM"

25
Catfish

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)
73
Charles

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");
14
T30

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/>';
    }

}
12
Toskan

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;
4
zion ben yacov

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.

2
Steve M.

Tu peux faire:

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

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}";
}
1
user2430012

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;
}

Comment utiliser:

$valid = validTime("23","H");
$valid = validTime("23:59","H:i");
$valid = validTime("23:59:59","H:i:s");
$valid = validTime("23:59:59");

valide = vrai

$valid = validTime("25","H");
$valid = validTime("01:60","H:i");
$valid = validTime("01:20:61","H:i:s");
$valid = validTime("01:20:61");

valide = faux

1
TILiBRA

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)

Explication

(? 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:

  1. Si $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)
  2. sinon utilisez [0-9] modèle pour correspondre à la notation des heures H ("9:45" Cas)

METTRE À JOUR

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).

0
Vladislav Savchuk

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)
0
Roshimon

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;
    }
}
0
Lakshitha Udara

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).

0
Sablefoste