Général
- Présentation
- Les Symboles
- Les Métacaractères
- Les Ancres et Classes
- Les options
- Constantes prédéfinies
- Equivalences
- Créer un motif
- Les POSIX
- Les PCRE
- Les Plus des PCRE
- Les Assertions Part I
- Les Assertions Part II
- Motif conditionnel
- Mysql et les regex
- Url Rewriting
- Optimisation
- Aide mémoire
Les PCRE
Les POSIX
Pratique
Spécial php
- Conseils et Astuces
- Délimiteur PCRE
- Créer une bdd
- Utiliser du BBcode
- Le binaire
- Faire un panier
- Cases à cocher
- Citations imbriquées
- Colorateur syntaxique
- Les list-box ou combo-box
- Faire un diaporama
- Isset ou empty ?
- Une légende au survol
- Site en plusieurs langues
- Requêtes dynamiques
- Gestion des smiley
- Faire un moteur de template
- Timestamp php/mysql
- Timestamp mysql
- Matcher une adresse email
- Controler des données
Les billets de fred
- Les POSIX... mise en pratique !
- Limiter l'accès à un répertoire
- Alternance de couleurs
- Magic_quotes
- Désactiver les short_tags
- Require ou include : Bench
- Cohérence dans les chaines de caractères
- "echo" : lapin ou tortue ?
- Gérer un formulaire avec plusieurs boutons
- Le formulaire a t'il été soumis ?
- J'ai décidé de grossir
- La guerre des étoiles
- La guerre des boutons
- Headers already sent
- IP, IP, IP, houra !
- Créer un itérateur avec PHP5
- On vous conduit vers la lumière
- Comment utiliser MySQL avec PHP
- Non aux booléens !
- Php.ini : dist /recommended
- Include : gouffre ou fêlure ?
- Simple comme les sessions !
- Simplifier le traitement des erreurs
- Structurez vos applications
- Franchement, t'es trop for !
- Notice: Undefined variable (ou index)
- Proscrire les variables auto déclarées
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).
// 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);
?>
Dans les expressions pour formater une date, j'utilise ereg_replace. Pour info, une solution est aussi donnée avec explode.
//--- 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;
?>
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.
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;
}
?>
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.
//--- 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;
?>
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 ...
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;
}
?>
Une autre approche avec preg_replace en utilisant le délimiteur de classe \d (chiffres uniquement)
$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];
?>
Un autre regex de formatage de date en français avec utilisation d'une fonction, d'un tableau, de substr...
$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);
?>
Grâce à strftime() et setlocale(), voilà un affichage simplisime de la date en français. Vraiment archi simple.
setlocale(LC_TIME, 'french');
echo strftime('Nous sommes le %A %d %B %Y, il est %Hh%M', time() );
?>
Petite portion permettant de déterminer les dates des samedis d'un mois et d'une année donnée. Exemple : mois = 1 et année = 2006 donnera les dates des samedi du mois de janvier 2006.
$mois=3;
$an=2006;
$nom_mois=
array(
1=>'Janvier',
'Février',
'Mars',
'Avril',
'Mai',
'Juin',
'Juillet',
'Août',
'Septembre',
'Octobre',
'Novembre',
'Décembre'
);
$nbj=date("t", mktime(0,0,0,$mois, 1, $an));
$samedi = 7 - date("w", mktime(0,0,0,$mois, 1, $an)); //Dimanche au samedi 1 à 7
$nbsam=round($nbj/7);
for($i=0;$i<=$nbsam;$i++)
{
if($samedi + 7*$i<=$nbj){
$sam_mois[]=$samedi + 7*$i;
}
}
echo 'Les samedi du mois de ',$nom_mois[$mois],' ',$an,' sont :<pre>';
print_r($sam_mois);
echo '</pre>';
?>
Un affichage simple du jour de la semaine.
$date=time();
function semaine($date)
{
$jour=date("z",$date);
$num_sem=($jour/7)+1;
$num=intval($num_sem);
return $num
}
echo semaine($date);
?>
Une méthode pour un affichage de date en français. Il existe d'autres fonctions qui permet de le faire facilement, mais il est intéressant de voir comment fonctionne les array() et option de date en php.
//--- DATE DU JOUR EN FRANCAIS ---//
//
$date1=time(now);
$date=getdate($date1);
function date_francais($date){
//--- Les noms de jours en Francais
$jour = array('dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi');
//--- Les noms de mois en Francais
$mois = array(1=>'janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
//--- le jour en français
$jourfr=$jour[$date['wday']];
//--- si vous souhaitez une majuscule pour le jour, activez la ligne ci-dessous
//$jourfr=ucfirst($jourfr);
//--- le jour en chiffre
$jour = $date['mday'];
//--- le mois en chiffre
$mois_cf = $date['mon'];
//--- le mois en français
$moisfr = $mois[$mois_cf] ;
//--- si vous souhaitez une majuscule pour le mois, activez la ligne ci-dessous
//$moisfr=ucfirst($moisfr);
//--- l'annee`
$annee = $date['year'];
//--- la date complète en français
$date_en_francais = "Nous sommes le $jourfr $jour $moisfr $annee.";
return $date_en_francais;
}
//--- Affichage ---//
echo date_francais($date);
//
//--- DATE EN FRANCAIS D'UN TIMESTAMP RECUPERER DANS UNE TABLE ---//
//--- peut utiliser le timestamp s'il est fourni ---//
//--- exemple : $date1="1034845105";
//--- la variable $date devient : $date=getdate($date1);
//--- la fonction ne change pas
?>
Plusieurs tests simples pour savoir si une année est bissextile.
// test 1
function bissextile($annee){
return checkdate(2,29,$annee);
}
// test 2
$an='2006';
if ($an % 4 == 0 && ($an % 100 != 0 || $an % 400 == 0))
{
echo 'bissextile';
}
else
{
echo 'pas bissextile';
}
// test 3
function bissextile($annee)
{
return (($annee % 4 == 0) && ($annee % 100 != 0 || $annee % 400 == 0));
}
echo bissextile($an);
?>
Une petite portion très simple permettant de connaître une date dans le futur.
$nb_jours = 10;
$madate = getdate(($nb_jours*24*3600)+mktime());
// $madate retourne un array
echo 'Dans ',$nb_jours,' jours nous serons le :
',$madate['mday'],'/',$madate['mon'],'/',$madate['year'];
?>
La même que la précédente, mais ici on s'amuse avec une fonction. J'y ai ajouté la notion de d'époque "futur ou passé" symboliser respectivement par le signe + ou - Le texte est bien évidemment adapté en sortie
function Xjours($sign_tmp,$nb_jours)
{
if($sign_tmp=='+'){
$madate = getdate(mktime()+($nb_jours*24*3600));
$sortie='Dans '.$nb_jours.' jours nous serons le : ';
}
else
{
$madate = getdate(mktime()-($nb_jours*24*3600));
$sortie='Il y a '.$nb_jours.' jours nous étions le : ';
}
return $sortie.' '.$madate['mday'].'/'.$madate['mon'].'/'.$madate['year'];
}
$nbj=1000;
$signe='-';
echo Xjours($signe,$nbj);
?>
Une petite fonction permettant de gérer un calendrier par semaine dans un formulaire. Affichera une liste de ce genre (pour les 52 semaines bien évidemment):
echo '<form><select name="mes_semaines">';
$semaine = 60*60*24*7;
$j1 = mktime(0,0,0,date('m'),date('d')-date('w')+1,date('Y'));
for ($i = 0; $i < 52; $i++)
{
echo '<option value="',date('d-m-Y',$j1),'">
du ',date('d-m-y',$j1),' au ',date('d-m-y', $j1 + $semaine),'</option>';
$j1 += $semaine;
}
echo '</select></form>';
?>
Une petite fonction qui permet de calculer et d'afficher l'âge d'un membre en rapport avec sa date de naissance extraite d'une base de données. La date passée en argument est au format Mysql soit YYYY-MM-DD Les facteurs de multiplication ont été choisi en gardant une certaine logique temporelle, mais vous pouvez en choisir d'autres de manière totalement arbitraire sans que cela ne gêne le calcul. Cette fonction est bien évidement adaptable à vos diverses situations
function age($ladate) {
$madate = explode('-',$ladate);
$j = 86400; //sec par jour
$m = 86400*30; // sec par mois (30 est un choix arbitraire)
$an = 86400*365.25; // sec par an
$madate_sec = $madate[0]*$an + $madate[1]*$m + $madate[2]*$j;
$today_sec = date('Y')*$an + date('m')*$m + date('d')*$j;
$age = floor(($today_sec-$madate_sec)/$an);
return $age;
}
$date='1959-04-12';
echo age($date);
?>
Petite fonction permettant de retourner le jour précis d'une semaine et d'une année au départ du nom du jour. Donc 3 arguments : - nom du jour - numéro de la semaine - année
function monjour($jour,$sem,$an)
{
$nom_jour=array('lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche');
$jj=array_search($jour,$nom_jour);
$an = date('Y');
$j_deb = ((($sem-1)*7)+8)-6;
return date('d-m-Y',mktime(0,0,0,1,$j_deb+$jj,$an));
}
echo monjour('mardi',31,2006);
?>
Fonction librement inspirée d'une source "facteur de date" de Rémy BAEGERT. Exprime en jours la différence qu'il existe entre deux dates données.
function facteur_date($date_entree)
{
$date=explode('-',$date_entree);
$an=365*$date[2];
$m=31*($date[1]-1);
if (($date[1]==1) || ($date[1]==2))
{
$d= 0;
$e = intval(($date[2] -1)/4);
$h = intval(0.75*(intval(($date[2]-1)/100)+1));
}
else
{
$d= intval(0.4*$date[1]+2.3);
$e = intval($date[2]/4);
$h = intval(0.75*(intval($date[2]/100)+1));
}
$resultat = $date[0] + $an+ $m - $d +$e -$h;
return $resultat;
}
function diff_dates($date1,$date2)
{
$diff = facteur_date($date2)-facteur_date($date1);
return $diff;
}
$datedeb='10-1-2005';
$datefin='1-1-2100';
echo diff_dates($datedeb,$datefin);
?>
Un système simplissime pour afficher une image en fonction du jour de la semaine. Il faudra bien entendu mettre la balise <img src="..." /> dans l'echo
$imgjour=array(
'image_dimanche',
'image_lundi',
'image_mardi',
'image_mercredi',
'image_jeudi',
'image_vendredi',
'image_samedi'
);
echo $imgjour[date('w')];
?>
preg_match('`^(((0[1-9])|([1-9])|(1\d)|(2\d)|(3[0-1]))\/((0[1-9])|([1-9])|(1[0-2]))\/(\d{4}))$`',$date)
