Créa-blog

#100JoursPourCoder
Projet Créa-code

Ressources pour développeur web

Théme de la semaine : Les REGEX

Regex téléphone : Valider un numéro de téléphone en JS / PHP

Temps de lecture estimé : 8 minutes
Accueil PHP 8 Regex téléphone : Valider un numéro de téléphone en JS / PHP

Il y a certains sujets en développement web qui peuvent faire peur, même aux personnes motivées. Les expressions régulières ou RegEx en font clairement partie. Pourtant, lorsqu’il s’agit de vérifier un numéro de téléphone, elles deviennent incroyablement utiles. Vous travaillez sur un formulaire, vous voulez éviter les erreurs des utilisateurs, et vous souhaitez que vos champs soient propres et fiables. C’est exactement là que la fameuse regex téléphone entre en jeu.

  • Comprendre clairement comment fonctionnent les regex appliquées aux numéros de téléphone, afin de ne plus les subir mais de savoir les maîtriser.
  • Savoir valider correctement un numéro en JavaScript et en PHP pour rendre vos formulaires plus fiables et plus professionnels.
  • Gagner en confiance et en autonomie en apprenant à éviter les erreurs courantes et à appliquer de bonnes pratiques simples et efficaces.

Pourtant, il n’y a rien de plus frustrant que de voir un utilisateur taper un numéro magnifique comme 06 45 21 87 99… et votre site lui répond froidement que ce numéro n’est pas valide. Cela agace tout le monde. Vous, parce que vous avez l’impression que votre code est nul, et lui parce qu’il a juste envie d’envoyer son formulaire. Voyons donc comment poser les bases sereinement en JavaScript puis en PHP, tout en comprenant vraiment ce que l’on fait.

Avant de plonger dans le code, prenons un instant. L’objectif n’est pas simplement de copier-coller une regex téléphone trouvée sur internet. L’objectif est que vous sachiez pourquoi elle fonctionne, comment l’adapter, comment la simplifier ou au contraire la rendre plus stricte. Si vous apprenez cela aujourd’hui, vous ferez déjà partie des développeurs qui comprennent, et pas seulement ceux qui bricolent.

Comprendre simplement ce qu’est une regex numéro de téléphone

Une expression régulière, souvent abrégée en regex, est une sorte de langage miniature qui sert à décrire un format de texte. Vous lui dites ce que vous autorisez, ce que vous refusez, et elle se charge de faire la police. Une regex numéro de téléphone permet de vérifier que ce qui est tapé ressemble réellement à un numéro de téléphone attendu. Cela peut être un numéro français, international, fixe, mobile, avec espaces ou non.

Pour vulgariser encore plus, imaginez un videur à l’entrée d’une boîte de nuit. Il regarde chaque caractère du numéro, vérifie si tout correspond aux règles, et seulement si tout est bon, il laisse passer.

Le plus important à retenir, c’est qu’une regex téléphone doit être pensée en fonction du contexte. Vous ne validerez pas un numéro français comme vous validerez un numéro international. C’est aussi pour cela qu’il n’existe pas UNE regex universelle, mais plutôt des regex adaptées à chaque besoin.

Et si on commençait avec le champ HTML input ?

Souvent, on pense uniquement à JavaScript et PHP pour valider un numéro de téléphone. Pourtant, avant même d’écrire une seule ligne de code, HTML peut déjà vous aider grâce au champ input type="tel". Ce type de champ est spécialement conçu pour la saisie de numéros. Il ne vérifie pas réellement la validité du numéro à lui seul, mais il donne déjà de sérieuses améliorations côté expérience utilisateur.

Concrètement, il indique au navigateur qu’il s’agit d’un numéro de téléphone. Par exemple, sur mobile, cela affiche automatiquement un clavier numérique adapté, ce qui évite aux utilisateurs de jongler avec lettres, caractères spéciaux et chiffres. Cela paraît simple, mais c’est un confort énorme pour eux et, indirectement, moins d’erreurs pour vous.

Voici un premier exemple très simple :

<input type="tel" name="telephone" placeholder="Votre numéro de téléphone">

Vous pouvez même aller un peu plus loin en combinant ce champ avec une regex grâce à l’attribut pattern. Cela permet déjà un premier filtre côté navigateur, avant même que JavaScript ou PHP n’interviennent.

Par exemple pour un numéro français mobile :

<input type="tel" 
       name="telephone" 
       pattern="^0[6-7][0-9]{8}$" 
       placeholder="Ex : 0645789654" 
       required>

Le navigateur vérifiera automatiquement si le numéro correspond au format attendu. S’il ne correspond pas, il affichera un message d’erreur natif, sans que vous n’ayez à coder quoi que ce soit de plus. Vous pouvez également ajouter required pour obliger la saisie.

Il faut tout de même garder quelque chose en tête : même si ce champ “tel” et l’attribut pattern aident beaucoup, ils ne remplacent jamais une validation sérieuse côté serveur. Ils améliorent le confort, réduisent les erreurs et offrent une meilleure ergonomie, mais ils ne doivent pas être votre seule protection.

Si vous combinez intelligemment input type="tel", validation JavaScript et vérification finale en PHP, vous obtenez une solution à la fois agréable pour l’utilisateur, moderne et robuste pour votre application. C’est exactement ce que l’on attend d’un développement propre et professionnel.

Premier exemple simple en JavaScript pour vérifier un numéro

Commençons avec JavaScript, car c’est souvent le premier langage que vous utiliserez côté navigateur pour vérifier un formulaire avant même de l’envoyer.

Imaginons que nous voulions simplement vérifier un numéro français classique commençant par 06 ou 07, suivi de 8 autres chiffres. Une première regex téléphone pourrait ressembler à ceci :

const regexTelephone = /^0[6-7]\d{8}$/;

const numero1 = "0645789654";
const numero2 = "0812345678";

console.log(regexTelephone.test(numero1)); 
console.log(regexTelephone.test(numero2));

Prenons le temps d’expliquer chaque morceau calmement.

Le symbole ^ indique le début de la chaîne. Cela signifie que notre vérification commence dès le premier caractère, sans tolérer autre chose avant.

Le 0 oblige la chaîne à commencer par zéro. Cela correspond à la réalité des numéros français.

Le bloc [6-7] signifie que juste après le zéro, nous acceptons uniquement 6 ou 7. Cela permet de limiter aux numéros mobiles.

Ensuite, \d représente un chiffre. Lorsque l’on écrit \d{8}, cela veut dire “exactement huit chiffres d’affilée”.

Enfin, le symbole $ indique la fin de la chaîne, ce qui empêche d’avoir du texte supplémentaire après le numéro.

Résultat, numero1 sera accepté, numero2 sera refusé. Vous venez déjà de créer une vraie regex numéro de téléphone fonctionnelle en JavaScript.

Si vous débutez : Regex pour débutant : comprendre ces “expressions bizarres”

Autoriser les espaces, car les utilisateurs n’écrivent pas toujours « proprement »

Dans la vraie vie, les gens mettent souvent des espaces entre les chiffres. Vous l’avez sûrement déjà fait. Un jour, en développant un formulaire, j’avais oublié cela. Résultat, j’ai passé près d’une heure à pester contre les utilisateurs… avant de réaliser que c’était moi qui étais trop strict. Ce jour-là, j’ai compris qu’un utilisateur n’est pas un développeur, et que notre travail consiste aussi à lui simplifier la vie.

Adaptons donc notre regex téléphone pour accepter des espaces :

const regexTelephone = /^0[6-7](?:\s?\d{2}){4}$/;

console.log(regexTelephone.test("06 45 78 96 54")); 
console.log(regexTelephone.test("0645789654")); 

Même principe, mais avec une subtilité supplémentaire.

Le groupe (?:\s?\d{2}) signifie que l’on accepte éventuellement un espace (\s?) suivi de deux chiffres. Le tout est répété quatre fois grâce à {4}. Ainsi, la regex numéro de téléphone accepte aussi bien 0645789654 que 06 45 78 96 54.

C’est beaucoup plus souple, beaucoup plus humain, et vos utilisateurs vous remercieront silencieusement.

Vérifier un numéro international avec indicatif

Le web n’est pas français, il est mondial. Peut-être que vous développerez un site multilingue. Peut-être que votre futur projet aura des clients un peu partout. Il est donc intéressant de comprendre comment gérer une regex téléphone au format international.

Exemple avec un numéro français au format +33 :

const regexTelephoneInternational = /^(\+33|0)[1-9]\d{8}$/;

console.log(regexTelephoneInternational.test("+33645789654"));
console.log(regexTelephoneInternational.test("0645789654"));

Ici, (+33|0) signifie que l’on accepte soit +33, soit 0. C’est une façon élégante de couvrir plusieurs formats sans dupliquer le code.

Cela montre aussi quelque chose d’important : plus votre regex numéro de téléphone est flexible, plus elle couvre de cas, mais plus elle devient complexe. Il faut donc toujours trouver un équilibre entre simplicité et précision.

Formation web et informatique - Alban Guillier - Formateur

Des formations informatique pour tous !

Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…

Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.

Découvrez mes formations Qui suis-je ?

Pourquoi valider côté JavaScript ne suffit jamais

JavaScript est très utile pour offrir une bonne expérience utilisateur. Votre formulaire réagit immédiatement, affiche un message d’erreur clair, et évite des va-et-vient inutiles vers le serveur. Mais il y a une règle essentielle : tout ce qui est côté navigateur peut être contourné.

Un utilisateur peut désactiver JavaScript. Il peut modifier votre formulaire. Il peut forcer l’envoi de données incorrectes. C’est pour cela qu’une regex numéro de téléphone doit aussi être validée côté serveur. Et c’est précisément ce que nous ferons avec PHP dans la prochaine partie de ce tutoriel.

Vous serez alors capable de sécuriser sérieusement vos applications, tout en gardant une logique cohérente entre JavaScript et PHP.

Utiliser une regex numéro de téléphone en PHP

Lorsque vous traitez un formulaire, PHP est souvent la dernière barrière avant l’enregistrement en base de données. C’est lui qui garantit la sécurité et la fiabilité des informations. Même si la validation JavaScript a déjà fait son travail, PHP doit refaire la vérification, car c’est la seule validation réellement incontestable.

La bonne nouvelle, c’est que les regex en PHP fonctionnent presque avec la même logique qu’en JavaScript, avec une petite différence : la fonction utilisée. En PHP, nous utilisons généralement preg_match.

Voici un premier exemple simple de regex numéro de téléphone pour un mobile français classique :

$regexTelephone = '/^0[6-7][0-9]{8}$/';

$numero1 = "0645789654";
$numero2 = "0812345678";

if (preg_match($regexTelephone, $numero1)) {
    echo "Numéro valide";
} else {
    echo "Numéro invalide";
}

Le principe est exactement le même que celui vu en JavaScript. Le symbole ^ marque le début de la chaîne, le 0 impose le premier caractère, [6-7] limite aux mobiles français, [0-9]{8} ajoute huit chiffres supplémentaires et le symbole $ indique la fin.

Si vous avez bien suivi jusque-là, vous venez de comprendre que la regex téléphone n’est pas un truc magique lié à un langage. C’est une logique universelle, simplement utilisée dans différents environnements.

Accepter les numéros avec espaces en PHP

Si vous souhaitez reproduire le même confort qu’en JavaScript, il faut aussi accepter les espaces en PHP. Là encore, le principe est très similaire. Voici une regex numéro de téléphone capable d’accepter les espaces ou un numéro collé :

$regexTelephone = '/^0[6-7](\s?[0-9]{2}){4}$/';

if (preg_match($regexTelephone, "06 45 78 96 54")) {
    echo "OK";
} else {
    echo "Non valide";
}

La partie (\s?[0-9]{2}) permet d’autoriser ou non un espace, puis deux chiffres, répétés quatre fois. Cela rend votre regex téléphone beaucoup plus conviviale. Vous offrez de la flexibilité, sans perdre la rigueur.

Et si vous vous dites que cela devient un peu technique, rassurez-vous, c’est normal. Beaucoup de développeurs expérimentés continuent parfois de vérifier leur regex sur des outils en ligne. Le plus important est de comprendre la logique plutôt que de tout retenir par cœur.

Gérer un numéro international avec PHP

Pour un format international, PHP suit exactement la même logique que JavaScript :

$regexTelephoneInternational = '/^(\+33|0)[1-9][0-9]{8}$/';

if (preg_match($regexTelephoneInternational, "+33645789654")) {
    echo "Valide";
} else {
    echo "Invalide";
}

Cette regex numéro de téléphone gère aussi bien +33 que 0 en début de numéro, suivi d’un chiffre entre 1 et 9, puis huit chiffres supplémentaires.

Petit détail important : si vous autorisez un numéro international, réfléchissez également à l’affichage. Peut-être que vous souhaiterez ensuite reformater le numéro, par exemple transformer +33645789654 en 06 45 78 96 54. Cela peut être intéressant pour la lisibilité.

Nettoyer un numéro avant de le valider

Parfois, au lieu de faire une regex téléphone extrêmement complexe, il est plus simple de nettoyer le numéro avant validation. Par exemple, vous pouvez retirer les espaces, les tirets, voire même les points si certaines personnes aiment écrire leurs numéros comme 06.45.78.96.54.

En PHP, vous pouvez faire ceci :

$numero = "06 45 78 96 54";
$numeroNettoye = preg_replace('/\D/', '', $numero);

echo $numeroNettoye;

La regex /\D/ signifie “tout ce qui n’est pas un chiffre”. En remplaçant cela par rien, vous obtenez un numéro propre, uniquement composé de chiffres. Ensuite, votre regex devient beaucoup plus simple puisqu’elle n’a plus besoin de gérer d’espaces.

Cette technique est souvent beaucoup plus confortable à maintenir sur des projets professionnels. Elle permet aussi aux utilisateurs d’écrire leurs numéros naturellement, sans frustration.

Les erreurs fréquentes avec une regex numéro de téléphone

Il existe plusieurs pièges classiques lorsque l’on débute.

La première erreur consiste à écrire une regex trop stricte. Vous pensez bien faire, mais vous bloquez des utilisateurs qui, pourtant, saisissent des numéros parfaitement valides. Par exemple, refuser tous les numéros qui ne sont pas mobiles alors que votre site pourrait très bien accepter les fixes.

La seconde erreur est l’inverse : faire une regex trop permissive. Vous acceptez presque tout et vous vous retrouvez avec des numéros du type 0000000000 ou 1234567890. Techniquement, cela correspond au format, mais ce ne sont pas de vrais numéros.

Enfin, certains développeurs oublient complètement de valider côté serveur et se reposent uniquement sur JavaScript. C’est une énorme faille, car n’importe qui peut contourner la validation et envoyer ce qu’il veut.

Comprendre ces erreurs vous permet déjà d’être largement au-dessus de la moyenne.

Faut-il vraiment tout valider avec une regex ?

Soyons honnêtes : une regex téléphone ne peut pas garantir qu’un numéro existe réellement. Elle ne peut valider que la forme. Par exemple, elle peut confirmer que le numéro a dix chiffres et commence par 06 ou 07. Mais elle ne pourra pas vous dire si ce numéro appartient réellement à quelqu’un.

Pour aller plus loin, certains sites utilisent l’envoi de SMS de confirmation. Ce n’est plus du tout le même sujet, mais cela montre que la regex téléphone est une étape importante, mais pas toujours suffisante selon le projet.

Ce qui est sûr, c’est qu’une regex numéro de téléphone propre, claire et bien pensée améliore immédiatement la qualité de vos formulaires, votre base de données et surtout l’expérience utilisateur.

JavaScript ou PHP pour la regex téléphone, lequel est le plus important ?

Si vous deviez absolument choisir, PHP serait la priorité, car il sécurise réellement votre application. Toutefois, le meilleur choix reste d’utiliser les deux. JavaScript pour aider l’utilisateur immédiatement et rendre l’expérience agréable. PHP pour vérifier sérieusement et empêcher les abus.

C’est exactement cette double validation qui est utilisée dans les sites professionnels, les boutiques en ligne, les systèmes d’inscription et toutes les plateformes sérieuses.

Différentes regex pour un numéro de téléphone français

/^0[1-9]\d{8}$/
// Numéro français simple à 10 chiffres sans espace.
/^0[6-7]\d{8}$/
// Numéro mobile uniquement, sans espace.
/^0[1-9](\s?\d{2}){4}$/
// Numéro français avec ou sans espaces entre les blocs de 2 chiffres.
/^0[1-9](?:[ .-]?\d{2}){4}$/
// Autorise espaces, tirets ou points comme séparateurs.
/^(\+33|0)[1-9]\d{8}$/
// Autorise format international +33 ou format classique.
/^(\+33|0)[1-9](\s?\d{2}){4}$/
// Version internationale avec possibilité d’espaces après conversion.
/^((\+33\s?)|0)[1-9](?:[ .-]?\d{2}){4}$/
// Accepte +33 avec option d’espace et divers séparateurs.
/^(\+33|0033|0)[1-9]\d{8}$/
// Autorise +33, 0033 ou 0 comme indicatif valide.
/^0[1-9](?:\d{2}){4}$/
// Version compacte stricte en 5 blocs de 2 chiffres sans séparation.
/^(\+33|0)[67]\d{8}$/
// Spécial mobile uniquement en format FR ou international.

Vous maîtrisez désormais la regex téléphone

Si vous êtes arrivé jusqu’ici, vous avez fait un vrai pas en avant. Vous savez désormais ce qu’est une regex téléphone, vous comprenez comment elle fonctionne, vous avez vu comment l’utiliser en JavaScript et en PHP, et vous avez appris à éviter les erreurs les plus fréquentes. Vous avez également découvert qu’une bonne validation n’est pas qu’une question de technique, mais aussi une question de confort utilisateur et de logique métier.

Vous verrez qu’avec un peu de pratique, les expressions régulières deviendront moins mystérieuses et beaucoup plus naturelles. Vous commencerez même à apprécier leur puissance, car elles vous feront gagner du temps, de la fiabilité et un certain plaisir de développeur quand tout fonctionne parfaitement.

Alors maintenant, que ce soit pour votre prochain formulaire, un site client ou un projet personnel, vous avez en main toutes les clés pour créer une regex téléphone propre, efficace et professionnelle. Et surtout, vous ne subirez plus ces numéros bancals qui polluent vos bases de données. Vous savez contrôler, vérifier et sécuriser. Et rien que ça, c’est déjà une belle victoire.