2.4Dates, expressions régulières & e-mails
Cette section regroupe trois besoins courants du web. D'abord, les dates et heures — omniprésentes (dates de création, d'événements, calculs de durée). PHP moderne privilégie l'approche ORIENTÉE OBJET avec la classe DateTime (et DateTimeImmutable, préférable car non modifiable) : créer une date (new DateTime('2026-07-25') ou new DateTime() pour maintenant), la FORMATER pour l'affichage (->format('d/m/Y') — jour/mois/année), calculer des DIFFÉRENCES (->diff() entre deux dates), ajouter/soustraire des durées. Les fonctions « procédurales » plus anciennes existent aussi (date(), time(), strtotime()) — vous les rencontrerez. Deux points de vigilance essentiels avec les dates : le fuseau horaire (configurez-le correctement, sinon les heures sont fausses — un piège classique) et le format de stockage en base (on stocke généralement les dates dans un format standard, comme le format ISO AAAA-MM-JJ, et on les FORMATE seulement à l'affichage — ne jamais stocker un format d'affichage localisé). Manipuler les dates correctement (avec DateTime, en gérant fuseau et format) évite des bugs subtils très fréquents.
Ensuite, les expressions régulières (regex) : un mini-langage pour DÉCRIRE et RECONNAÎTRE des motifs dans du texte. Elles permettent de VÉRIFIER qu'une chaîne suit un format (un code postal, un numéro de téléphone, un identifiant), d'EXTRAIRE des parties, de REMPLACER selon un motif. En PHP, on utilise les fonctions preg_match() (le motif correspond-il ?), preg_match_all(), preg_replace() (remplacer selon un motif), preg_split(). Les regex sont PUISSANTES mais réputées difficiles (leur syntaxe est cryptique). Un conseil important : pour les validations COURANTES (email, URL…), n'écrivez PAS votre propre regex — utilisez plutôt filter_var() avec les filtres appropriés (par exemple, valider un email avec filter_var($email, FILTER_VALIDATE_EMAIL)), plus fiable qu'une regex maison (valider un email par regex correctement est étonnamment difficile). Réservez les regex aux motifs SPÉCIFIQUES à votre besoin non couverts par les filtres. Enfin, l'envoi d'e-mails : PHP dispose d'une fonction native mail(), mais elle est BASIQUE et peu fiable en pratique (problèmes de délivrabilité, spam, configuration serveur). Pour envoyer des e-mails sérieusement, on utilise des BIBLIOTHÈQUES dédiées (comme PHPMailer ou Symfony Mailer) qui gèrent correctement l'authentification SMTP, les pièces jointes, le HTML, et améliorent la délivrabilité — ou des services d'envoi tiers. Un point de SÉCURITÉ : ne jamais insérer de données utilisateur non contrôlées dans les en-têtes d'un e-mail (faille d'« injection d'en-tête »). Ces trois sujets (dates, regex, e-mails) sont des besoins pratiques fréquents. L'essentiel à retenir : manipulez les dates avec DateTime (en gérant fuseau et format de stockage), validez avec filter_var plutôt que des regex maison pour les cas courants, et envoyez les e-mails avec une bibliothèque dédiée (pas la fonction mail() basique) — dans chaque cas, en s'appuyant sur les outils éprouvés plutôt que de tout faire à la main.
Vocabulaire de la section
- Dates (DateTime)
- PHP moderne manipule les dates avec la classe DateTime/DateTimeImmutable : créer, FORMATER pour l'affichage (->format), calculer des différences (->diff), ajouter/soustraire.
- Fuseau & format de stockage
- Points de vigilance : configurer le FUSEAU horaire (sinon heures fausses) ; STOCKER les dates dans un format standard (ISO AAAA-MM-JJ) et les FORMATER seulement à l'affichage.
- Expressions régulières (regex)
- Mini-langage décrivant des motifs dans du texte ; preg_match (correspond ?), preg_replace (remplacer). Puissantes mais difficiles.
- filter_var pour valider
- Pour les validations courantes (email, URL…), préférer filter_var (FILTER_VALIDATE_EMAIL…) à une regex maison — plus fiable. Réserver les regex aux motifs spécifiques.
- Envoi d'e-mails
- La fonction native mail() est basique/peu fiable ; utiliser des bibliothèques dédiées (PHPMailer, Symfony Mailer) pour la fiabilité. Ne jamais injecter de données non contrôlées dans les en-têtes.
Comment manipuler les dates et valider un email correctement en PHP ?
En pratique — Dates, regex et e-mails
- Manipulez des dates avec DateTime : créez, formatez pour l'affichage (->format('d/m/Y')), calculez une différence (->diff) ; configurez le fuseau horaire.
- Retenez : stocker les dates au format standard (ISO) et FORMATER seulement à l'affichage (jamais stocker un format localisé).
- Validez avec filter_var (email, URL) plutôt qu'avec une regex maison ; réservez les regex (preg_match) aux motifs spécifiques.
- Pour envoyer un e-mail sérieusement, utilisez une bibliothèque dédiée (PHPMailer / Symfony Mailer) plutôt que mail() ; n'injectez jamais de données non contrôlées dans les en-têtes.
Points clés à retenir
- DATES : PHP moderne utilise la classe DateTime/DateTimeImmutable (créer, ->format pour l'affichage, ->diff pour les différences). Vigilance : FUSEAU horaire (sinon heures fausses) et FORMAT de STOCKAGE (ISO AAAA-MM-JJ, formater seulement à l'affichage).
- REGEX (preg_match, preg_replace) = motifs dans du texte, puissantes mais difficiles. Pour les validations COURANTES (email, URL), préférer `filter_var` (FILTER_VALIDATE_EMAIL) à une regex maison.
- E-MAILS : la fonction native `mail()` est basique/peu fiable ; utiliser des BIBLIOTHÈQUES dédiées (PHPMailer, Symfony Mailer) pour la fiabilité et la délivrabilité.
- Principe transversal : s'appuyer sur les OUTILS ÉPROUVÉS (DateTime, filter_var, bibliothèques d'e-mail) plutôt que tout faire à la main. Sécurité : pas de données non contrôlées dans les en-têtes d'e-mail.
Questions fréquentes
Quels sont les pièges courants avec les dates en PHP, et comment les éviter ?
Les dates sont une source classique de bugs subtils en programmation (pas seulement en PHP), à cause des fuseaux horaires, des formats et de la complexité intrinsèque du temps — voici les pièges principaux et comment les éviter. (1) Le FUSEAU HORAIRE mal configuré. LE piège n°1. Si le fuseau horaire n'est pas correctement défini (dans la configuration PHP ou explicitement), les dates/heures peuvent être DÉCALÉES (par exemple, le serveur est configuré sur un fuseau différent du vôtre, et toutes vos heures sont fausses de plusieurs heures). Conséquences : des horodatages incorrects, des calculs de durée faux, des affichages trompeurs. Comment éviter : (a) CONFIGUREZ explicitement le fuseau horaire (dans php.ini via date.timezone, ou dans le code via date_default_timezone_set()) — utilisez le bon fuseau pour votre contexte. (b) Pour les applications INTERNATIONALES, stockez les dates en UTC (temps universel) et convertissez au fuseau de l'utilisateur seulement à l'affichage — c'est la pratique recommandée pour gérer plusieurs fuseaux. (c) Avec DateTime, vous pouvez spécifier le fuseau explicitement, ce qui donne le contrôle. (2) Confondre FORMAT de STOCKAGE et FORMAT d'AFFICHAGE. Un piège fréquent : stocker les dates dans un format d'affichage LOCALISÉ (comme « 25/07/2026 » ou « July 25, 2026 »). C'est une ERREUR. Il faut STOCKER les dates dans un format STANDARD, non ambigu, triable (typiquement le format ISO AAAA-MM-JJ HH:MM:SS, qui est aussi le format des dates en base de données), et FORMATER pour l'affichage SEULEMENT au moment de montrer à l'utilisateur (->format('d/m/Y')). Pourquoi : (a) le format ISO est NON AMBIGU (25/07 vs 07/25 — jour/mois ou mois/jour ? l'ISO AAAA-MM-JJ lève l'ambiguïté) ; (b) il est TRIABLE (les dates ISO se trient correctement comme des chaînes) ; (c) il est standard (bases de données, échanges). Stocker un format localisé rend les dates difficiles à trier, comparer, et sujettes aux ambiguïtés. Règle : stockage en ISO/standard, affichage formaté/localisé. (3) Utiliser les fonctions ANCIENNES vs DateTime. Les fonctions procédurales anciennes (date(), strtotime(), mktime()) fonctionnent mais sont moins pratiques et plus piégeuses pour les manipulations complexes (calculs, différences, fuseaux). PHP moderne privilégie la classe DateTime (et surtout DateTimeImmutable, non modifiable — plus sûr, évite des bugs de modification accidentelle) : plus lisible, plus puissante (différences avec diff, ajout/soustraction d'intervalles, gestion des fuseaux). Utilisez DateTime/DateTimeImmutable pour les manipulations de dates. (4) Les calculs de DURÉE et d'INTERVALLE. Calculer une différence entre deux dates « à la main » (soustraire des timestamps) est piégeux (années bissextiles, changements d'heure, mois de longueurs différentes). Utilisez ->diff() de DateTime qui gère cela correctement (renvoie un intervalle avec années, mois, jours…). (5) Le CHANGEMENT D'HEURE (heure d'été/hiver). Les transitions d'heure (DST) causent des bugs subtils (une journée peut avoir 23 ou 25 heures, une heure peut « ne pas exister » ou « exister deux fois »). DateTime avec les bons fuseaux gère cela ; les calculs manuels sur timestamps peuvent se tromper. (6) Les FORMATS d'ENTRÉE. Parser une date depuis une chaîne (saisie utilisateur, format inconnu) est risqué (strtotime peut mal interpréter). Utilisez DateTime::createFromFormat() pour parser un format PRÉCIS et connu, et validez. Les bonnes pratiques résumées : (1) CONFIGUREZ le fuseau horaire explicitement ; pour l'international, stockez en UTC, affichez au fuseau de l'utilisateur. (2) STOCKEZ les dates au format STANDARD ISO (AAAA-MM-JJ), FORMATEZ seulement à l'affichage (ne jamais stocker un format localisé). (3) Utilisez DateTime/DateTimeImmutable (moderne, puissant) plutôt que les fonctions anciennes pour les manipulations. (4) Utilisez ->diff() pour les différences (gère bissextiles, mois, etc.). (5) Parsez les entrées avec createFromFormat (format précis) et validez. En résumé : les pièges des dates en PHP sont surtout le FUSEAU HORAIRE mal configuré (heures fausses — piège n°1, à configurer explicitement, UTC pour l'international), la confusion FORMAT DE STOCKAGE (ISO standard) / AFFICHAGE (localisé, seulement au moment de montrer), l'usage des fonctions anciennes plutôt que DateTime, et les calculs de durée/DST manuels. Les éviter : configurez le fuseau, stockez en ISO et formatez à l'affichage, utilisez DateTime/DateTimeImmutable et ses méthodes (diff, format). Les dates sont intrinsèquement complexes (fuseaux, formats, calendrier) — s'appuyer sur les outils appropriés (DateTime) et suivre ces bonnes pratiques évite des bugs subtils et fréquents. Une gestion rigoureuse des dates est un marqueur de code soigné.
Faut-il apprendre les expressions régulières, et quand les utiliser (ou les éviter) ?
Les expressions régulières (regex) sont un outil PUISSANT mais souvent MAL UTILISÉ — il vaut la peine d'en comprendre les bases, mais il faut savoir quand les utiliser et surtout quand les ÉVITER au profit d'outils plus adaptés. Ce que sont les regex : un mini-langage pour décrire des MOTIFS dans du texte, permettant de VÉRIFIER (une chaîne correspond-elle à un format ?), EXTRAIRE (récupérer des parties), REMPLACER (selon un motif), DÉCOUPER. En PHP : preg_match, preg_match_all, preg_replace, preg_split. Leur réputation (méritée) : les regex sont à la fois puissantes et DIFFICILES. Leur syntaxe est cryptique (/^[a-z0-9._%+-]+@.../), difficile à lire, à écrire correctement, et à déboguer. Une regex mal écrite peut ne pas couvrir tous les cas, en accepter de mauvais, ou même causer des problèmes de performance (certaines regex mal formées sont très lentes sur certaines entrées — un risque de déni de service). D'où la prudence recommandée. Quand ÉVITER les regex (au profit d'autres outils) : (1) Pour les VALIDATIONS COURANTES (email, URL, IP, entier…). C'est le conseil le plus important : n'écrivez PAS votre propre regex pour valider un email, une URL, etc. Utilisez filter_var() avec les filtres appropriés (FILTER_VALIDATE_EMAIL, FILTER_VALIDATE_URL, FILTER_VALIDATE_INT…). Pourquoi : valider un email CORRECTEMENT par regex est étonnamment DIFFICILE (la spécification des emails valides est complexe) — les regex « maison » d'email sont presque toujours soit trop strictes (rejettent des emails valides) soit trop laxistes (acceptent des invalides). filter_var le fait de façon éprouvée et fiable. Idem pour les URL, IP, etc. Ne réinventez pas ces validations par regex. (2) Pour des manipulations SIMPLES de chaînes (chercher une sous-chaîne, remplacer un mot exact, découper sur un séparateur) : utilisez les fonctions de chaîne dédiées (str_contains, str_replace, explode…) plutôt qu'une regex — plus simples, plus lisibles, plus rapides. On voit parfois des regex utilisées pour des tâches triviales que des fonctions de chaîne feraient mieux (« utiliser un marteau-piqueur pour planter un clou »). Quand les regex sont JUSTIFIÉES : (1) Pour des motifs SPÉCIFIQUES à votre besoin, non couverts par les outils standard : valider un format particulier (un code produit interne, un format de référence spécifique, un numéro selon une règle métier), extraire des données selon un motif précis d'un texte, faire un remplacement conditionnel complexe. (2) Quand le motif est réellement « à motif » (une structure qui se décrit bien par un pattern, avec des variations) et qu'aucune fonction dédiée ne le fait. Dans ces cas, les regex sont l'outil adapté et puissant. Faut-il les APPRENDRE ? Oui, il vaut la peine de comprendre les BASES des regex (les métacaractères courants, comment lire et écrire des motifs simples), car : (1) vous en RENCONTREREZ (dans du code existant, des configurations, des outils) — savoir les lire est utile ; (2) elles sont parfois le bon outil (motifs spécifiques) ; (3) elles sont TRANSVERSALES (les regex existent dans presque tous les langages et outils — un savoir réutilisable). Mais n'en faites pas une obsession : (1) apprenez à LIRE et écrire des regex SIMPLES ; (2) pour les cas complexes, appuyez-vous sur des ressources (des outils en ligne de test/explication de regex existent, très utiles pour construire et comprendre une regex) ; (3) utilisez les outils DÉDIÉS (filter_var, fonctions de chaîne) quand ils existent, plutôt que des regex ; (4) TESTEZ soigneusement vos regex (avec des cas variés, y compris limites) — une regex non testée est risquée. Conseils pratiques : (1) pour valider email/URL/etc. → filter_var (pas de regex maison). (2) Pour chercher/remplacer/découper simplement → fonctions de chaîne. (3) Pour des motifs SPÉCIFIQUES → regex, testées, avec l'aide d'outils. (4) COMMENTEZ vos regex complexes (expliquez ce que fait le motif) — sans commentaire, une regex est illisible six mois plus tard. En résumé : oui, comprenez les bases des regex (utile, transversal, parfois le bon outil), mais utilisez-les à BON ESCIENT : ÉVITEZ-les pour les validations courantes (email, URL → filter_var, plus fiable qu'une regex maison) et les manipulations simples (→ fonctions de chaîne) ; RÉSERVEZ-les aux motifs spécifiques non couverts par les outils standard. Les regex sont puissantes mais difficiles et souvent mal utilisées — le bon développeur sait quand les employer (motifs spécifiques, testées, commentées) et quand préférer un outil dédié (le cas le plus fréquent). Ne tombez pas dans le piège d'utiliser des regex partout par « virtuosité » : le bon outil pour le bon besoin, et pour beaucoup de cas courants, ce n'est PAS une regex.