Fonction qui essaie de retourner une date valide comme elle peut...

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 818 fois - Téléchargée 29 fois

Contenu du snippet

Ce script permet de vérifier et de retourner un une date entrée manuellement par l'utilisateur.
J'attends vos commentaires et suggestions pour améliorer le script.

Source / Exemple :


function dateValidReturnTry($date) // Valid is : dd/mm/yyyy
{
	function _arraySortByKeys(&$a) // Ré-index toutes les clés d'un tableau sans effectué de tri
	{
		$i = 0;
		foreach($a as $k => $v)
		{
			$a[$i] = $v;
			$i++;
		}
	}
	
	// Pré formatage
	$date = trim($date);
	$date = str_replace('-', '/', $date);
	$date = str_replace(' ', '/', $date);
	$date = str_replace('.', '', $date);
	
	if (strlen($date) == 8 && is_numeric($date)) // Si c'est une date sans séparateur
	{
		$date = substr($date, 0, 2) . '/' . substr($date, 2, 2) . '/' . substr($date, 4, 4); // On les ajoute
	}

	if (!ereg('/', $date)) // Si, même après le pré formatage, il est impossible de trouver de séparateur
	{
		return false;
	}

	$d = explode('/', $date); // Separation des différents éléments de la date
	
	if (count($d) != 3 || !is_numeric($d[0]) || !is_numeric($d[1]) || !is_numeric($d[2]))
	{ // Si le tableau ne contient pas trois éléments ou si ceux-ci ne sont pas des nombres
		return false;
	}
	
	$s = array();
	
	// On stock chaque taille de chaque élément dans un tableau en y assignant la même clé
	$s[0] = strlen($d[0]);
	$s[1] = strlen($d[1]);
	$s[2] = strlen($d[2]);
	
	if ($s[0] + $s[1] + $s[2] != 8 || $s[0] > 4 || $s[1] > 4 || $s[2] > 4 || $s[0] == 3 || $s[1] == 3 || $s[2] == 3 || $s[0] < 2 || $s[1] < 2 || $s[2] < 2)
	{ // Si la somme des éléments et différente de 8 ou si un des éléments est supérieur à 4 ou égale à 3 ou inférieur à 2
		return false;
	}

	foreach ($s as $k => $v)
	{
		if ($v == 4) // Si la valeur de l'élément en cours est égale à 4
		{
			$year = $d[$k]; // On cherche son homologue dans le tableau des éléments de la date et on le désigne comme étant l'année
			unset($d[$k]); // On supprime cet élément du tableau des éléments de la date
			break; // On stock la boucle car nous avons trouvé notre année !
		}
	}
	
	_arraySortByKeys($d); // On ré-organise la tableau car l'élément que l'on vient de supprimer peut être n'importe lequel
	
	if ($d[1] >= 1 && $d[1] <= 12 && $d[0] > 12)
	{ // Si le second élément (des éléments restants) est > 1 et < 12 et que le premier élément est lui > 12
		$month = $d[1]; // C'est forcement cet index du tableau qui est le mois
		unset($d[1]);
	}
	else
	{
		$month = $d[0]; // Sinon, on considère que le premier élément est le mois
		unset($d[0]);
	}
	
	_arraySortByKeys($d); // Même chose, on ré-organise
	
	if (!isset($month) || !isset($year) || !checkdate($month, $d[0], $year))
	{ // Si le mois ou l'année n'a pas été trouvé ou que la date est temporellement invalide (même si sa syntaxe est bonne)
		return false;
	}

	return $d[0] . '/' . $month . '/' . $year;
}

Conclusion :


J'attends vos avis.

A voir également

Ajouter un commentaire Commentaires
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Hello,

ta fonction est marrante.
Néanmoins, un reproche : si la date passée est valide, ta fonction ne renvoie que false, à priori. Tu devrais renvoyer la date.
Ensuite, un truc qui...bon...est un choix : elle inverse systématiquement, si c'est possible, jour et mois. S on met
1998/05/06 on obtient 06/05/1998.
Idem pour ça : echo dateValidReturnTry ('05/1998/06');
Et ça : echo dateValidReturnTry ('05199806');
retourne un truc bizarre ;-): 19/05/9806 . Je doute que ta fonction soit encore utilisée en 9806...tu peux mettre une borne, je pense.

Enfin je trouve ton code peu clair : surtout au niveau des variables.
Je ne vois pas l'intérêt de déclarer une fonction DANS une autre fonction.
Ceci :
$date = str_replace('-', '/', $date);
$date = str_replace(' ', '/', $date);
peut-être raccourci, éventuellement.

J'ai plus le temps de continuer, lol. Bref, je trouve ta fonction sympa:-)
Messages postés
56
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2009

Je pige pas trop ce que fait ton code...
Ya un truc qiu me parait byzarre dans ton if avec tes 12 millions de conditions : un nombre entier est forcemment > 4, =3 ou <2 non? donc ta condition est forcement vrai et ta fonction retourne systematiquement false ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.