Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/08/2007, 10h54   #1
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
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 :
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
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 11h01   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
il faudrait que tu vérifies que ton explode te renvoie bien trois éléments (avec count()) avant de les utiliser peut etre.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 11h31   #3
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
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.
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 11h37   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je ne sais pas si ça répond à votre question mais puisqu'on est dans le forum Regex :
Code :
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";
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 12h07   #5
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
j'ai fait un copier/coller mais j'ai un message d'erreur
Citation:
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
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 13h24   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 14h07   #7
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
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 :
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
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 15h10   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est exact :
Code :
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
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 15h23   #9
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Merci pour votre aide
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h06.


 
 
 
 
Partenaires

Hébergement Web