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

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

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.