84 votes

Fonction permettant de vérifier si une chaîne de caractères est une date

J'essaie d'écrire une fonction pour déterminer si une chaîne est une date/heure en utilisant PHP. En gros, une date/heure valide ressemblerait à ceci :

 2012-06-14 01:46:28

Il est évident qu'il est totalement dynamique et que toutes les valeurs peuvent changer, mais il doit toujours se présenter sous la forme de XXXX-XX-XX XX:XX:XX Comment puis-je écrire une expression régulière qui vérifie la présence de ce motif et renvoie un résultat positif en cas de correspondance ?

5voto

Salman A Points 60620

J'utilise cette fonction comme paramètre de la fonction PHP filter_var fonction.

  • Il vérifie la présence de dates dans yyyy-mm-dd hh:mm:ss format
  • Il rejette les dates qui correspondent au modèle mais qui ne sont pas valides (par exemple, le 31 avril).

function filter_mydate($s) {
    if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$@', $s, $m) == false) {
        return false;
    }
    if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) {
        return false;
    }
    return $s;
}

3voto

Chris Walsh Points 169

Bien que la réponse à cette question soit acceptée, elle ne fonctionnera pas efficacement dans tous les cas. Par exemple, j'ai testé la validation de la date sur un champ de formulaire en utilisant la date "10/38/2013", et j'ai obtenu un DateObject valide, mais la date était ce que PHP appelle "débordée", de sorte que "10/38/2013" devient "11/07/2013". C'est logique, mais devons-nous accepter la date réformée, ou forcer les utilisateurs à saisir la bonne date ? Pour ceux d'entre nous qui sont des nazis de la validation des formulaires, nous pouvons utiliser cette solution : https://stackoverflow.com/a/10120725/486863 et renvoie simplement false lorsque l'objet lance cet avertissement.

L'autre solution consisterait à faire correspondre la chaîne de dates à la date formatée et à comparer les deux pour vérifier qu'elles sont égales. Cela semble tout aussi compliqué. Mais bon. Telle est la nature du développement PHP.

1voto

emmanuel Points 107
if (strtotime($date) > strtotime(0)) {
    echo 'it is a date'
}

1voto

ericksho Points 113

J'ai trouvé ma réponse ici https://stackoverflow.com/a/19271434/1363220 , de manière basse

$d = DateTime::createFromFormat($format, $date);
// The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
if($d && $d->format($format) === $date) {
    //it's a proper date!
}
else {
    //it's not a proper date
}

0voto

Artefact2 Points 2987

Je n'utiliserais pas de Regex pour cela, mais je diviserais simplement la chaîne et vérifierais que la date est valide :

list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring);
if(!checkdate($month, $day, $year)) {
     /* print error */
} 
/* check $hour, $minute and $second etc */

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X