2010-09-26 3 views
0

Je reçois des dates d'une zone de texte au format jj-mm-aaaa ou jj/mm/aaaa (l'utilisateur est autorisé à utiliser - ou /) Je vérifie (en utilisant une regex ou php) si la date est valide? Existe-t-il une méthode regex ou php pour valider les dates dans ce format? J'ai essayé de chercher ici mais je n'ai rien trouvé.Date de validation jj-mm-aaaa ou jj/mm/aaaa

+0

Je l'ai trouvé. Ça va prendre -/ainsi que. $ ver_date ('29 -02-2009 '); fonction ver_date (de C_DATE de $) \t { \t \t if (preg_match ('/^(((0 [1-9] | [12] \ d |. 3 [01]) [\ s \ \ - \ /](0[13578]|1[02])[\s\.\-\/]((19|[2-9]\d)\d{2}))|((0[1-9 ] | [12] \ d | 30) [\ s \. \ - \ /] (0 [13456789] | 1 [012]) [\ s \. \ - \ /] ((19 | [2-9] \ d) \ d {2})) | ((0 [1-9] | 1 \ d | 2 [0-8]) [\ s \. \ - \ /] 02 [\ s \. \ - \ /]((||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -9] | [2-9] \ d) (0 [48] | [2468] [048] | [13579] [26]) | ((16 | [2468] [048] | [3579] [26]) 00)))) $/», C_DATE de $)) \t \t { \t \t \t echo "date OK"; \t \t} \t \t autre \t \t {echo 'Date Erreur';}} \t – Norman

+5

$ dates Obtenir de saisie de texte utilisateur est juste demander des ennuis sans fin. Utilisez les boîtes de sélection déroulantes ou quelque chose de similaire. – GZipp

+0

@GZipp: même s'il prend la date de la liste déroulante - il doit la valider – zerkms

Répondre

2

Je suis venu avec cette petite fonction, il vérifie que vous utilisez le format DD(separator)MM(sameseparator)YYYY

Avec DD, MM et YYYY comme entiers.

function valid_date($input_date) { 
    if(!preg_match('/(?P<d>\d{2})(?P<sep>\D)(?P<m>\d{2})\2(?P<y>\d{4})/',$input_date, $aux_date)) 
     return false; 
    $aux = mktime(0,0,0,$aux_date['m'],$aux_date['d'],$aux_date['y']); 
    return $input_date == date('d'.$aux_date['sep'].'m'.$aux_date['sep'].'Y',$aux); 
} 

(Edité comme sugested ci-dessous)

+0

Pourquoi ne pas simplement' return $ date_entrée == date ('d'. $ aux_date [ 'sep']. 'm'. $ aux_date ['sep']. 'Y', $ aux) '. Vous avez 3 lignes d'inutilité autrement. +1 pour l'expression régulière: Je ne savais pas que vous pouvez nommer vos groupes. –

+0

Vous avez absolument raison. Merci. –

-1

Une expression régulière seule ne peut pas valider une date en raison du nombre différent de jours en mois, en particulier pour les années bissextiles.

/^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/ 

mais surtout regex permet de résoudre votre problème de permettre - ou/en fonction de ces formats dd-mm-aaaa ou jj/mm/aaaa

Voici quelques exemples

//Date d/m/yy and dd/mm/yyyy 
//1/1/00 through 31/12/99 and 01/01/1900 through 31/12/2099 
//Matches invalid dates such as February 31st 
'\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b' 

//Date dd/mm/yyyy 
//01/01/1900 through 31/12/2099 
//Matches invalid dates such as February 31st 
'(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}' 

//Date m/d/y and mm/dd/yyyy 
//1/1/99 through 12/31/99 and 01/01/1900 through 12/31/2099 
//Matches invalid dates such as February 31st 
//Accepts dashes, spaces, forward slashes and dots as date separators 
'\b(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}\b' 

//Date mm/dd/yyyy 
//01/01/1900 through 12/31/2099 
//Matches invalid dates such as February 31st 
'(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}' 

//Date yy-m-d or yyyy-mm-dd 
//00-1-1 through 99-12-31 and 1900-01-01 through 2099-12-31 
//Matches invalid dates such as February 31st 
'\b(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])\b' 

//Date yyyy-mm-dd 
//1900-01-01 through 2099-12-31 
//Matches invalid dates such as February 31st 
'(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])' 
+0

Cela permettrait également '5/2/02', c'est-à-dire qu'il ne répond pas aux exigences. Au moins, vous devriez le mentionner. –

+0

Cela ne vérifie pas si la date est * valide *. –

0

Une manière très simpliste serait d'avoir une expre régulière ssion qui vérifie l'un des formats, puis assurez-vous que l'entrée est converti en ce premier en remplaçant tous les caractères:

$regexDate = '#\d\d\-\d\d\-\d\d\d\d#' ; 

$dateIn = trim($_GET['date']) ; 

//replace all/with - since our regex expects those 
$dateIn = str_replace('/', '-', $dateIn) ; 

if (preg_match($regexDate, $dateIn)) { 
    //valid date input 
} 
+0

Cela ne vérifie pas si la date est * valide *. –

+0

@Dan, donc "simpliste". Vous pouvez le coupler en vérifiant si les éléments de date sont dans les plages plus tard, mais vous devez commencer quelque part – Fanis

0

j'utiliser strftime et strptime. Tout d'abord je convertir chaîne en « temps » que revenir à la chaîne et le comparer ...

1

Je recommande fortement d'utiliser la méthode PHP strtotime(), car il ne sera pas seulement vérifier si le format est valide, mais si l'heure spécifiée par le format est correcte aussi (c'est-à-dire qu'il n'y aura jamais de 31 Février, mais une regex pourrait ne pas l'attraper).

Vous pouvez vérifier si cela est valide avec if (strtotime($toCheck)) { car il renverra FALSE s'il ne réussit pas (http://us2.php.net/strtotime).

EDIT: Vous aurez besoin de changer l'ordre avant de pouvoir vérifier si la date est valide avec strtotime d'abord comme ceci:

$str = "07-31-1987"; 
$str = preg_replace('/([^-\/]+)[-\/]([^-\/]+)[-\/]([^-\/]+)/', '$2-$1-$3', $str); 
echo date('r', strtotime($str)) . "\n"; // Fri, 31 Jul 1987 00:00:00 -0700 
+2

'strtotime()' ne gère pas jj/MM/YYY –

+0

'echo date ('r', strtotime ('07/31/2010 '))); // Sat, 31 Jul 2010 00:00:00 -0700' –

+0

pas de jj/mm mais MM/jj :) –

11
$date = str_replace("/", "-", $incoming); 
$d = explode("-" , $date); 

Re-assembler les pièces, puis exécutez à travers checkdate

if(!checkdate($d[1], $d[0], $d[2])) 
echo 'Not a recognised date' ; 

http://www.php.net/manual/en/function.checkdate.php

+0

+1 C'est la bonne façon de valider une date, pas 'strtotime()' – NullUserException

+0

'$ incoming = '3-2-1- * pop *';' – salathe

+0

Je ne savais pas qu'il y avait une fonction checkdate ... La vie est maintenant plus facile. –

0

Vous pouvez utiliser la classe datetime, en passant la date à laquelle vous souhaitez valider au constructeur. Si vous avez une date valide, vous récupérerez un objet datetime. Si c'est une date invalide, le constructeur va lancer une exception, que vous pouvez attraper et gérer l'erreur en conséquence.

0
'/^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/' 

Ceci fera l'affaire.

+0

Jésus ... Merci :) – Norman