1) Vérifie la validité d'une date
posté par Yves Maistriaux (ID : 22)
On vérifie dans une chaine et on accepte les dates en français sous cette forme :
03/05/2003
03/05/2003 14:58
03/05/2003 14:58:59
Pour la date en anglais, on inverse la première partie de la regex
pour obtenir MM/DD/YYYY
On peut encore créer des masques supplémentaires pour réaliser contrôler sur d'autres formes.
<?php
date="03/05/2003 14:58:27";
if(!preg_match('`^(((0[1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|(1[0-2]))\/(\d{4})(((([[:space:]]?)(([0-1][0-9])|([2][0-3]))(:[0-5][0-9]))((:[0-5][0-9])?))?))$`',$date1))
{
echo 'pas bon';
}
else
{
echo 'la date est '.$date1;
}
?>
2) Formater une date (V1)
posté par Yves Maistriaux (ID : 27)
Deux fonctions, ereg et preg_match, pour un résultat identique.
De nouveau, une regex n'est pas forcément nécessaire pour obtenir le résultat voulu.
Une version avec substr est fournie en complément d'information.
<?php
//--- avec ereg ---//
$date="2003-05-20";
ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs);
echo "$regs[3]/$regs[2]/$regs[1]";
// avec preg_match maintenant ---//
$date="2003-05-20";
preg_match ('`(\d{4})-(\d{1,2})-(\d{1,2})`', $date, $out);
echo "$out[3]/$out[2]/$out[1]";
//--- pour info le même résultat avec substr
$date="2003-05-20";
$an=substr($date,0,4);
$mois=substr($date,5,2);
$jour=substr($date,8,2);
echo $jour.'/'.$mois.'/'.$an;
?>
3) Et encore un formatage de date...
posté par Yves Maistriaux (ID : 50)
Une autre approche avec preg_replace en utilisant le délimiteur de classe \d (chiffres uniquement)
<?php
$madate="2003-06-19";
$motif='`(\d{4})-(\d{1,2})-(\d{1,2})`';
$afficher='$3-$2-$1';
echo preg_replace($motif,$afficher,$madate);
// pour info, sans regex avec explode
$madate=explode('-',$madate);
echo $madate[2].'-'.$madate[1].'-'.$madate[0];
?>
4) Fonction pour une date en français...
posté par Yves Maistriaux (ID : 53)
Un autre regex de formatage de date en français avec utilisation d'une fonction, d'un tableau, de substr...
<?php
$date="2003-09-08";
function date_francais($date){
preg_match ('`^(\d{4})-(\d{2})-(\d{2})(.*)$`', $date, $out);
if($out[2]<10){$out[2]=substr($out[2],1,1);}
$i=$out[2];
$mois = array('','janvier', 'fevrier', 'mars', 'avril', 'mai','juin','juillet', 'aout', 'septembre', 'octobre','novembre', 'decembre');
return $out[3].' '.$mois[$i].' '.$out[1].' '.$out[4];
}
echo 'Fonction date en français : Nous sommes le ',date_francais($date);
?>
5) Formater une date
posté par Frédéric Bouchery (ID : 28)
Dans les expressions pour formater une date, j'utilise ereg_replace.
Pour info, une solution est aussi donnée avec explode.
<?php
//--- avec ereg_replace ---//
$date='2003-05-20';
echo ereg_replace( '([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', '\\3/\\2/\\1', $date);
//--- sans regex avec explode ---//
$date='2003-05-20';
list( $année, $mois, $jour ) = explode( '-', $date );
echo $jour, '/', $mois, '/', $année;
?>
6) Saisie de date
posté par Frédéric Bouchery (ID : 44)
Pour proposer à vos utilisateur une saisie de date sans trop de contraite, voici deux fonctions TRES tolérantes.
On peut commencer par "le" avec la date puis "à" et l'heure.
Si on ne saisie pas le mois et/ou l'année, il fait le rapprochement par rapport à la date du jour.
C'est à dire, si l'on saisie "le 3" alors que nous le 5 novembre, il déduit que l'on parle du 3 décembre.
D'ailleurs, on peut saisir les mois en toutes lettres ...
<?php
function checkDateTime($date)
{
list($day, $month, $year) = explode(',', date('d,m,Y'));
static $month_fr = array(1 => 'janvier', 'f[ée]vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao[ûu]t', 'septembre', 'octobre', 'novembre', 'd[ée]cembre');
if (preg_match('`^ *(le +)?([0-3]?[0-9])( *[-/ ] *(([0-1]?[0-9])|(' . implode('|' , $month_fr) . '))( *[-/ ] *([0-9]{1,4}))?)? +([aà] +)?([0-2]?[0-9]) *[:h] *([0-5][0-9]) *$`i', $date, $match)) {
if (empty($match[4])) {
if ($match[2] > $day) $match[4] = $month;
elseif ($month == 12) $match[4] = 1;
else $match[4] = $month + 1;
}
if (!empty($match[6])) {
foreach($month_fr as $month_value => $mask) {
if (preg_match('`' . $mask . '`i', $match[4])) {
$match[4] = $month_value;
break;
}
}
}
if (empty($match[8])) {
if ($match[4] > $month) $match[8] = $year;
else $match[8] = $year + 1;
}
print_r($match);
if (checkdate($match[4], $match[2], $match[8])) {
if ($match[10] < 24 and $match[11] < 60) return $match[8] . '-' . $match[4] . '-' . $match[2] . ' ' . $match[10] . ':' . $match[11] . ':00';
}
}
return false;
}
function checkDateOnly($date)
{
list($day, $month, $year) = explode(',', date('d,m,Y'));
static $month_fr = array(1 => 'janvier', 'f[ée]vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao[ûu]t', 'septembre', 'octobre', 'novembre', 'd[ée]cembre');
if (preg_match('`^ *(le +)?([0-3]?[0-9])( *[-/ ] *(([0-1]?[0-9])|(' . implode('|' , $month_fr) . '))( *[-/ ] *([0-9]{1,4}))?)? *$`i', $date, $match)) {
if (empty($match[4])) {
if ($match[2] > $day) $match[4] = $month;
elseif ($month == 12) $match[4] = 1;
else $match[4] = $month + 1;
}
if (!empty($match[6])) {
foreach($month_fr as $month_value => $mask) {
if (preg_match('`' . $mask . '`i', $match[4])) {
$match[4] = $month_value;
break;
}
}
}
if (empty($match[8])) {
if ($match[4] > $month) $match[8] = $year;
else $match[8] = $year + 1;
}
print_r($match);
if (checkdate($match[4], $match[2], $match[8])) {
return $match[8] . '-' . $match[4] . '-' . $match[2];
}
}
return false;
}
?>
7) Date MySQL en francais
posté par Fabrice Lezoray (ID : 17)
Cette expression regulière vous permettra de fomater une date venant de MySQL (ou autre) dans un format francais.
La date d'entrée peut être soit un Timestamp UNIX, soit une date au format DATE de MySQL (YYYY-MM-DD) ou soit une date au format DATETIME de MySQL (YYYY-MM-DD HH-MM-SS).
La date de sortie est au format francais DD-MM-YYYY (HH-MM-SS).
<?php
// Format datetime
$date ='2002-12-25 16:00:00';
// Format date
// $date = '2003-12-25';
// Un timestamp
// $date = time();
function callback_date($match) {
if(is_numeric($match[1]))
return date('d-m-Y H:i:s', $match[1]);
else
return $match[4] . '-' . $match[3] . '-' . $match[2] . $match[5];
}
echo preg_replace_callback('`^(\d+|(\d{4})-(\d{2})-(\d{2})(.*))$`', 'callback_date', $date);
?>