227 votes

Valider un numéro de téléphone avec JavaScript

J'ai trouvé ce code sur un site web, et il fonctionne parfaitement. Il valide que le numéro de téléphone est dans l'un de ces formats :
(123) 456-7890 ou 123-456-7890

Le problème est que mon client (je ne sais pas pourquoi, peut-être des trucs de client) veut ajouter un autre format, les dix numéros consécutifs, quelque chose comme ça : 1234567890 .

J'utilise cette expression régulière,

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

Comment puis-je ajouter qu'il valide également l'autre format ? Je ne suis pas doué pour les expressions régulières.

244voto

EeeeeK Points 2191

L'expression rationnelle que j'ai choisie est la suivante :

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

Formats valables :

(123) 456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

155voto

josh3736 Points 41911

Tout d'abord, votre validateur de format n'est manifestement approprié que pour les formats NANP (indicatif de pays +1). Votre application sera-t-elle utilisée par une personne dont le numéro de téléphone ne se trouve pas en Amérique du Nord ? Si c'est le cas, vous ne voulez pas empêcher ces personnes d'entrer un numéro [international] parfaitement valide.

Deuxièmement, votre validation est incorrecte. Les numéros NANP se présentent sous la forme NXX NXX XXXXN est un chiffre de 2 à 9 et X est un chiffre de 0 à 9. En outre, les indicatifs de zone et les centraux peuvent ne pas se présenter sous la forme suivante N11 (terminer par deux "un") pour éviter toute confusion avec les services spéciaux sauf les numéros dans un indicatif non géographique (800, 888, 877, 866, 855, 900) peuvent avoir une N11 échange.

Ainsi, votre expression rationnelle transmettra le numéro (123) 123 4566 même s'il ne s'agit pas d'un numéro de téléphone valide. Vous pouvez corriger cela en remplaçant \d{3} avec [2-9]{1}\d{2} .

Enfin, j'ai l'impression que vous validez les données de l'utilisateur dans un navigateur web. Rappelez-vous que la validation côté client est seulement un commodité que vous fournissez à l'utilisateur ; vous devez toujours valider toutes les entrées (à nouveau) sur le serveur.

TL;DR n'utilisez pas d'expression régulière pour valider des données complexes du monde réel telles que des numéros de téléphone ou URL . Utiliser un bibliothèque spécialisée .

80voto

kennebec Points 33886

Si vous cherchez 10 et seulement 10 chiffres, ignorez tout sauf les chiffres

   return value.match(/\d/g).length===10;

50voto

elishas Points 571
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123) 456-7890
+(123) 456-7890
+(123)-456-7890
+(123) - 456-7890
+(123) - 456-78-90
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

Il s'agit d'une option très souple que je préfère conserver. Je l'utilise principalement dans les formulaires d'inscription où les utilisateurs doivent ajouter leur numéro de téléphone. En général, les utilisateurs ont des difficultés avec les formulaires qui appliquent des règles de formatage strictes. Je préfère que l'utilisateur remplisse le numéro et le formate ensuite à l'écran ou avant de l'enregistrer dans la base de données. http://regexr.com/3c53v

36voto

Paul Schreiber Points 7214

Ce que je ferais, c'est ignorer le format et valider le contenu numérique :

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X