2010-01-18 7 views
15

J'essaie de valider la date en utilisant PHP.Validez le format de la date en php

Je voudrais les formats suivants pour être valide:

d/m/yy 
d/m/yyyy 
dd/m/yy 
dd/m/yyyy 
d/mm/yy 
d/mm/yyyy 
dd/mm/yy 
dd/mm/yyyy 

J'ai essayé beaucoup d'expressions régulières et des variations différentes de la fonction checkdate(). À l'heure actuelle, j'ai quelque chose comme ceci:

function _date_is_valid($str) 
{ 
    if(strlen($str) == 0) 
     return TRUE; 
    if(substr_count($str,'/') == 2) 
    { 
     if (preg_match("/^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2}))/", $str)) 
     { 
      $datearray = explode('/',$str); 
      if($datearray[2] > 2030) 
       return FALSE; 
      return checkdate($datearray[1], $datearray[0], $datearray[2]); 
     } 
     else 
     { 
      return FALSE; 
     } 
    } 
    return FALSE; 
} 

Cependant, cela valide les dates comme 11/11/200 et 11/11/200 #

Comment puis-je valider ce jour pour correspondre format requis? Editer: Je pourrais vérifier datearray [2] pour être entre 10 et 30 et 2010 et 2030. Mais est-il un moyen de le vérifier en utilisant regex? Edit1: return TRUE sur strlen ($ str) == 0 parce que je veux que les utilisateurs puissent ajouter des événements sans savoir quand l'événement se produira afin que quelqu'un d'autre puisse qualifier l'horaire et assigner l'événement à une certaine date plus tard


Juste pour l'enregistrement. J'ai fini par faire:

function _date_is_valid($str) 
{ 
    if(strlen($str) == 0) //To accept entries without a date 
     return TRUE; 
    if(substr_count($str,'/') == 2) 
    { 
     list($d,$m,$y) = explode('/',$str); 
     if(($y >= 10 && $y <= 30) || ($y >= 2010 && $y <= 2030)) 
     { 
      return checkdate($m,$d,$y); 
     } 
    } 
    return FALSE; 
} 

Merci pour toutes vos réponses

Répondre

24
function _date_is_valid($str) { 
    if (substr_count($str, '/') == 2) { 
     list($d, $m, $y) = explode('/', $str); 
     return checkdate($m, $d, sprintf('%04u', $y)); 
    } 

    return false; 
} 
+0

Devrait être checkdate(), pas check_date(). A part ça, ça me va bien. +1 –

+0

si vous ne vérifiez pas le nombre de '/' il jettera un avis php ou un avertissement sur les chaînes invalides – antpaw

+0

Je l'ai modifié un peu pour ne pas valider les dates après certaine année car php checkdate() valide des années comme 20111 qui dans ce cas n'est pas ce que je veux – LukeP

2

Essayez ceci:

function _date_is_valid($str) { 
    if (strlen($str) == 0) { 
     return TRUE; 
    } 
    return preg_match('/^(\d{1,2})\/(\d{1,2})\/((?:\d{2}){1,2})$/', $str, $match) && checkdate($match[2], $match[1], $match[3]) && $match[2] <= 2030; 
} 
+0

pourquoi le retour TRUE ? – erenon

+0

Je souhaite que la date soit laissée vide ou dans un format valide. C'est une sorte de calendrier des événements où vous pouvez réserver un événement pour une certaine date ou réserver un événement et quelqu'un d'autre va allouer la date à plus tard – LukeP

+0

Ne pas vérifier le jour ou le mois sont valides. –

8

Si elle sera toujours jour/mois/année, vous pouvez utiliser checkdate:

function _date_is_valid($str) 
{ 
    $array = explode('/', $str); 

    $day = $array[0]; 
    $month = $array[1]; 
    $year = $array[2]; 

    $isDateValid = checkdate($month, $day, $year); 
    return $isDateValid; 
} 
+0

Doit être checkdate(), pas check_date(). Et vous pourriez vouloir faire un isset() pour les indices de tableau $. A part ça, ça me va bien.+1 –

+0

oh oui, vous avez raison, c'est checkdate(), copié à partir de la question sans le vérifier. Merci – marvin

+0

Que faire s'il n'y a pas deux séparant '/'? – Gumbo

0

qu'en est-il de if(strtotime($str) !== FALSE) $valid = TRUE;

+1

-1: OP était très précis sur les formats à accepter. Votre solution permet plusieurs autres formats. –

+1

et aussi il y a un problème entre jj/mm/aaaa et mm/jj/aaaa – LukeP

1

Je viens de changer la réponse martin ci-dessus, qui validera tout type de date et retournera dans le format que vous voulez.

Il suffit de changer le format en éditant la ligne du script strftime ("10-10-2012", strtotime ($ dt));

<?php 

     echo is_date("13/04/10"); 

     function is_date($str) 
     { 
     $flag = strpos($str, '/'); 

     if(intval($flag)<=0){ 
      $stamp = strtotime($str); 
     }else { 
      list($d, $m, $y) = explode('/', $str);  
      $stamp = strtotime("$d-$m-$y"); 
     } 
      //var_dump($stamp) ; 

      if (!is_numeric($stamp)) 
      { 
      //echo "ho" ; 
      return "not a date" ;  
      } 

      $month = date('n', $stamp); // use n to get date in correct format 
      $day = date('d', $stamp); 
      $year = date('Y', $stamp); 

      if (checkdate($month, $day, $year)) 
      { 
      $dt = "$year-$month-$day" ; 
      return strftime("%d-%b-%Y", strtotime($dt)); 
      //return TRUE; 
      }else { 
      return "not a date" ; 
      } 
     } 

    ?> 
1

Ce que je l'ai fait pour le valider était simple

function dateValidate($pDate) { 
    if(empty($pDate)) 
     return true; 
    $chDate = date('Y-m-d', strtotime($pDate)); 
    if($chDate != '1970-01-01') 
     return true; 
    else 
     return false; 
} 

Vous pouvez le trouver avec l'aide regexp trop

4

un moyen facile de faire ce

<?php 
    if(!$formated_date = date_create_from_format('Y-m-d',$dateVar)) 
+1

Vous une étoile cela m'a bien aidé. Bon travail – humphrey