IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Vérifier une chaîne (date) [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut Vérifier une chaîne (date)
    Bonjour.

    Dans mon formulaire je demande la saisie d'une date que je controle.
    Je vérifie la longueur de la chaîne, les jours, etc.
    le séparateur est un "/".
    Quand je fais explode("/", ma_date) j'ai un message d'erreur si le séparateur n'est pas "/".
    Comment je peux éviter ce problème?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    if (isset($_POST['sortie1']))	$sortie1 = $_POST['sortie1'];
    else $sortie1 ="";
    $jour = "";
    $mois= "";
    $annnee = "";
    $tableau = "0000-00-00";
    if ((strlen($sortie1) != 10) && strlen($sortie1) > 0){
    	$message= "$sortie1 n'est pas une date valide";
    }
    else if (strlen($sortie1) == 10){
    	$tableau = explode("/",$sortie1);
    	$jour = $tableau[0];
    	$mois = $tableau[1];
    	$annee = $tableau[2];
    	if ((($mois == 4) || ($mois == 6) || ($mois == 9) || ($mois == 11)) && $jour == 31){
    		$message = "$jour/$mois/$annee est une date non valide";
    		$tableau = "0000-00-00";
    	}
    	else if ($mois == 2){
    		if( (is_int($annee/4) && !is_int($annee/100)) || is_int($annee/400)) {
    			// Année bissextile
    			if ($jour > 29) {
    				$message = "$jour/$mois/$annee est une date non valide";
    				$tableau = "0000-00-00";
    		}
    		} else {
    			// Année NON bissextile
    			if ($jour > 28) {
    				$message = "$jour/$mois/$annee est une date non valide";
    				$tableau = "0000-00-00";
    			}
    		}
    	}
    	else if ($jour > 31){
    		$message = "$jour/$mois/$annee est une date non valide";
    		$tableau = "0000-00-00";
    	}
    	else {
    	$tableau = "$annee-$mois-$jour";
    	$tableaufr = "$jour/$mois/$annee";
    	}
    }
    Merci d'avance

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    il faudrait que tu vérifies que ton explode te renvoie bien trois éléments (avec count()) avant de les utiliser peut etre.

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Oui je peux calculer le nombre de séparateur mais ça ne donnera pas le type de séparateur.
    si ma date est 20/08/2007 mon test marche mais pas avec 20-08-2007 et poutant la date est bonne.
    Dans explode est ce qu'on peut pas dire explode("x",ma_date) où x est n'importe quelle valeur.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Je ne sais pas si ça répond à votre question mais puisqu'on est dans le forum Regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $date = '20/08/2007';
    if (preg_match('#^(\d{2})([/ -])(\d{2})\2(\d{4})$#', $date, $m) && checkdate($m[3], $m[1], $m[4]))
    {
      echo "date valide";
    }
    else
    {
      echo "date non valide";
    }

  5. #5
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    j'ai fait un copier/coller mais j'ai un message d'erreur
    Warning: Compilation failed: range out of order in character class at offset 12 in c:\weblocal\sites\monsite\ajout_film.php on line 193
    comme je n'ai jamais utiliser preg_match je ne vois pas où est l'erreur.
    j'avais entré 20/08/2007

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Corrigé, désolé j'ai rajouté quelque chose au mauvais endroit. En l'occurrence il s'agissait de l'espace après le tiret alors que ce dernier aurait dû être échappé ou figurer en dernier.

  7. #7
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Merci ça marche mais j'aimerai savoir si j'ai pas des doublons de controle dans mon code.
    D'après ce que j'ai vu, checkdate controle les années bissextiles donc le mois de février et les mois de 30 jours.

    mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    if ((strlen($sortie1) != 10) && strlen($sortie1) > 0){
    	$message= "$sortie1 n'est pas une date valide";
    }
    else if (strlen($sortie1) == 10){
    	if (preg_match('#^(\d{2})([/])(\d{2})\2(\d{4})$#', $sortie1, $m) == 1 && checkdate($m[3], $m[1], $m[4])) 
    	{
    		$tableau = explode("/",$sortie1);
    		$jour = $tableau[0];
    		$mois = $tableau[1];
    		$annee = $tableau[2];
    		if ((($mois == 4) || ($mois == 6) || ($mois == 9) || ($mois == 11)) && $jour == 31){
    			$message = "$jour/$mois/$annee est une date non valide !";
    			$tableau = "0000-00-00";
    		} 
    		else if ($mois == 2){
    			if( (is_int($annee/4) && !is_int($annee/100)) || is_int($annee/400)) {
    				// Année bissextile
    				if ($jour > 29) {
    					$message = "$jour/$mois/$annee est une date non valide !";
    					$tableau = "0000-00-00";
    				}
    			}
    			else {
    				// Année NON bissextile
    				if ($jour > 28) {
    					$message = "$jour/$mois/$annee est une date non valide !";
    					$tableau = "0000-00-00";
    				}
    			}
    		}
    		else if ($jour > 31){
    			$message = "$jour/$mois/$annee est une date non valide !";
    			$tableau = "0000-00-00";
    		}
    		else {
    			$tableau = "$annee-$mois-$jour";
    			$tableaufr = "$jour/$mois/$annee";
    		}
    	}
    	else {
      		$message = "Format de date ou date non valide. !";
    	}
    }
    j'ai l'impression que toute la partie à partir de $tableau explode .... ne sert à rien.

    Merci de me confirmer

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    C'est exact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	if (preg_match('#^(\d{2})([/])(\d{2})\2(\d{4})$#', $sortie1, $m)) 
    	{
    		if (!checkdate($m[3], $m[1], $m[4])) {
    			$message = "$jour/$mois/$annee est une date non valide !";
    			$tableau = "0000-00-00";
    		}
    		else {
    			$tableau = sprintf('%s-%s-%s', $m[4], $m[3], $m[1]);
    			$tableaufr = sprintf('%s/%s/%s', $m[1], $m[3], $m[4]);
    		}
    	}
    	else {
      		$message = "Format de date ou date non valide. !";
    	}
    En espérant avoir respecté votre logique et ne pas avoir introduit d'erreur

  9. #9
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'une colonne automatiquement suivant date
    Par paflolo dans le forum Access
    Réponses: 7
    Dernier message: 07/03/2006, 17h51
  2. Réponses: 14
    Dernier message: 28/10/2005, 18h41
  3. cocher une case+affichage de dates
    Par Toff !!!!! dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 10h07
  4. Alimentation d'une table de dimension date
    Par kluh dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/07/2005, 14h34
  5. Calculer une duree entre 2 dates
    Par d.w.d dans le forum C++
    Réponses: 7
    Dernier message: 02/03/2005, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo