Je dois déterminer si un numéro de téléphone est valide avant d'essayer de le composer. L'appel téléphonique peut aller n'importe où dans le monde.
Quelle expression régulière correspondra aux numéros de téléphone internationaux valides?
Je dois déterminer si un numéro de téléphone est valide avant d'essayer de le composer. L'appel téléphonique peut aller n'importe où dans le monde.
Quelle expression régulière correspondra aux numéros de téléphone internationaux valides?
Réponses:
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$
Est le format correct pour faire correspondre un numéro de téléphone international générique. J'ai remplacé le code d'accès international 011 centré sur la ligne terrestre américaine par l'identifiant standard du code d'accès international «+», ce qui le rend obligatoire. J'ai également changé le minimum du numéro national à au moins un chiffre.
Notez que si vous entrez des numéros dans ce format dans le carnet d'adresses de votre téléphone mobile, vous pouvez appeler avec succès n'importe quel numéro de votre carnet d'adresses, peu importe où vous voyagez. Pour les lignes fixes, remplacez le signe plus par le code d'accès international du pays à partir duquel vous composez.
Notez que cela NE prend PAS en compte les règles du plan de numérotation national - en particulier, cela autorise les zéros et les uns dans les emplacements que les plans de numérotation nationaux peuvent ne pas autoriser et autorise également des longueurs de numéro supérieures au plan de numérotation national pour certains pays (par exemple, les États-Unis).
^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
00
devant. Du point de vue du développement et de la maintenance, je dirais que c'est parfaitement bien d'appliquer tous les numéros pour commencer +
ou même de les remplacer 00
par un à +
chaque fois que vous l'obtenez - d'autant plus que la plupart des gens connaissent le +
format (que la plupart des champs de saisie téléphoniques internationaux exiger de toute façon). De plus, c'est une solution à une seule ligne et beaucoup plus lisible. Cette approche garantirait également que tous les numéros de téléphone sont dans le même format et rend votre validation beaucoup moins sujette aux erreurs, ce qui rend l'ensemble plus facile à gérer.
00
n'envoyait pas le message correctement, alors que commencer par a +
fonctionnerait toujours à l'international. Nous pouvons devenir fous et rendre les choses super complexes, mais parfois c'est possible / cela vaut la peine de laisser tomber quelques contraintes pour nous rendre la vie plus facile :)
Tous les codes de pays sont définis par l'UIT. L'expression régulière suivante est basée sur l'UIT-T E.164 et l' Annexe du Bulletin d'exploitation de l'UIT No 930 - 15.IV.2009 . Il contient tous les codes de pays actuels et les codes réservés pour une utilisation future. Bien que cela puisse être un peu raccourci, j'ai décidé d'inclure chaque code indépendamment.
Ceci est pour les appels provenant des États-Unis. Pour les autres pays, remplacez le code d'accès international (le 011 au début de l'expression régulière) par tout ce qui est approprié pour le plan de numérotation de ce pays .
Notez également que l'UIT E.164 définit la longueur maximale d'un numéro de téléphone international complet à 15 chiffres. Cela signifie qu'un code de pays à trois chiffres donne jusqu'à 12 chiffres supplémentaires, et un code de pays à 1 chiffre peut contenir jusqu'à 14 chiffres supplémentaires. D'où le
[0-9]{0,14}$
a la fin de l'expression régulière.
Plus important encore, cette expression régulière ne signifie pas que le numéro est valide - chaque pays définit son propre plan de numérotation interne. Cela garantit seulement que le code du pays est valide.
283 | 282 | 281 | 280 | 269 | 268 | 267 | 266 | 265 | 264 | 263 | 262 | 261 | 260 | 259 | 258 | 257 | 256 | 255 | 254 | 253 | 252 | 251 | 250 | 249 | 248 | 247 | 246 | 245 | 244 | 243 | 242 | 241 | 240 | 239 | 238 | 237 | 236 | 235 | 234 | 233 | 232 | 231 | 230 | 229 | 228 | 227 | 226 | 225 | 224 | 223 | 222 | 221 | 220 | 219 | 218 | 217 | 216 | 215 | 214 | 213 | 212 | 211 | 210 | 98 | 95 | 94 | 93 | 92 | 91 | 90 | 86 | 84 | 82 | 81 | 66 | 65 | 64 | 63 | 62 | 61 | 60 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1) [0-9] {0, 14} $
C'est une optimisation supplémentaire.
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$
(i) permet des préfixes internationaux valides
(ii) suivis de 9 ou 10 chiffres, avec n'importe quel type ou placement de délimiteurs (sauf entre les deux derniers chiffres)
Cela correspondra:
+ 1-234-567-8901
+ 61-234-567-89-01
+ 46-234 5678901
+1 (234) 56
89901 +1 (234) 56-89 901
+46.234.567.8901
+1 / 234/567/8901
Vous pouvez utiliser la bibliothèque libphonenumber de Google.
PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String decodedNumber = null;
PhoneNumber number;
try {
number = phoneNumberUtil.parse(encodedHeader, null);
decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164);
} catch (NumberParseException e) {
e.printStackTrace();
}
J'utilise celui-ci:
/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/
Avantages: reconnaît les débuts + ou 011, le laisse être aussi long que nécessaire et gère de nombreuses conventions d'extension. (#, x, ext, extension)
Voici une version "optimisée" de votre regex:
^011(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$
Vous pouvez remplacer le \d
s par [0-9]
si votre syntaxe regex ne prend pas en charge \d
.
Pour iOS SWIFT, j'ai trouvé cela utile,
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
Expression régulière modifiée de @ Eric - ajout d'une liste de tous les codes de pays (obtenu de xxxdepy @ Github . J'espère que vous le trouverez utile:
/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/
Il y a évidemment une multitude de façons de le faire, comme en témoignent toutes les différentes réponses données jusqu'à présent, mais je vais jeter ma valeur de 0,02 $ ici et fournir le regex ci-dessous, ce qui est un peu plus laconique que presque tout ce qui précède , mais plus approfondi que la plupart des autres. Il a également le bon effet secondaire de laisser le code du pays en 1 $ et le numéro local en 2 $.
^ \ + (? = \ d {5,15} $) (1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] ..) (\ d +) $
Aucune critique concernant ces excellentes réponses, je veux juste présenter la solution simple que j'utilise pour nos créateurs de contenu administrateur:
^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$
Forcer le début avec un plus ou deux zéros et utiliser au moins un peu de chiffres, un espace blanc, des accolades, un signe moins et un point est facultatif et aucun autre caractère. Vous pouvez supprimer en toute sécurité tous les non-nombres et l'utiliser dans une entrée tel :. Les nombres auront une forme de représentation commune et je n'ai pas à me soucier d'être trop restrictif.
Une version simple pour les numéros européens, qui correspond à des numéros comme 0034617393211 mais aussi à des numéros longs comme 004401484172842.
^0{2}[0-9]{11,}
J'espère que ça aide :·)
public static boolean validateInternationalPhoneNumberFormat(String phone) {
StringBuilder sb = new StringBuilder(200);
// Country code
sb.append("^(\\+{1}[\\d]{1,3})?");
// Area code, with or without parentheses
sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");
// Phone number separator can be "-", "." or " "
// Minimum of 5 digits (for fixed line phones in Solomon Islands)
sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");
// 4 more optional digits
sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");
return Pattern.compile(sb.toString()).matcher(phone).find();
}
Voici une expression régulière pour les scénarios de numéro de téléphone les plus courants suivants. Bien que cela soit adapté du point de vue américain pour les indicatifs régionaux, cela fonctionne pour les scénarios internationaux.
Un numéro de téléphone valide ne peut pas être composé uniquement de zéros.
^(?!\b(0)\1+\b)(\+?\d{1,3}[. -]?)?\(?\d{3}\)?([. -]?)\d{3}\3\d{4}$
Explication:
^ - start of expression
(?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros.
(\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.
\(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.
([. -]?) - optional space, dash or dot
$ - end of expression
Plus d'exemples et d'explications - https://regex101.com/r/hTH8Ct/2/
J'ai utilisé ceci ci-dessous:
^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$
Le format + CCC.NNNNNNNNNNxEEEE ou 00CCC.NNNNNNNNNNxEEEE
Le numéro de téléphone doit commencer par «+» ou «00» pour un appel international. où C est le code du pays à 1 à 3 chiffres,
N comprend jusqu'à 14 chiffres,
et E est l'extension (facultative).
Le signe plus au début et le point suivant le code du pays sont obligatoires. Le caractère littéral «x» n'est requis que si une extension est fournie.
Essayez l'API suivante pour la validation du numéro de téléphone. Cela renverra également le pays, la région et le fournisseur
démo https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0
Le plan de numérotage international est basé sur le plan de numérotage UIT E.164 . Je suppose que c'est le point de départ de votre expression régulière.
Je mettrai à jour ceci si je me déplace pour créer une expression régulière basée sur la numérotation ITU E.164.
Cette expression Regex fonctionne pour les numéros de téléphone de l'Inde, du Canada, de l'Europe, de la Nouvelle-Zélande, de l'Australie et des États-Unis, ainsi que leurs codes de pays:
"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"
Même si cela n'utilise pas vraiment RegExp pour faire le travail - ou peut-être à cause de cela - cela me semble être une bonne solution: https://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
Essayez ceci, cela fonctionne pour moi.
^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
J'ai créé l'expression régulière pour les numéros de téléphone européens, et elle est spécifique au préfixe de numérotation par rapport à la longueur du numéro.
const PhoneEuropeRegExp = () => {
// eu phones map https://en.wikipedia.org/wiki/Telephone_numbers_in_Europe
const phonesMap = {
"43": [4, 13],
"32": [8, 10],
"359": [7, 9],
"385": [8, 9],
"357": 8,
"420": 9,
"45": 8,
"372": 7,
"358": [5, 12],
"33": 9,
"350": 8,
"49": [3, 12],
"30": 10,
"36": [8, 9],
"354": [7, 9],
"353": [7, 9],
"39": [6, 12],
"371": 8,
"423": [7, 12],
"370": 8,
"352": 8,
"356": 8,
"31": 9,
"47": [4, 12],
"48": 9,
"351": 9,
"40": 9,
"421": 9,
"386": 8,
"34": 9,
"46": [6, 9],
};
const regExpBuilt = Object.keys(phonesMap)
.reduce(function(prev, key) {
const val = phonesMap[key];
if (Array.isArray(val)) {
prev.push("(\\+" + key + `[0-9]\{${val[0]},${val[1]}\})`);
} else {
prev.push("(\\+" + key + `[0-9]\{${val}\})`);
}
return prev;
}, [])
.join("|");
return new RegExp(`^(${regExpBuilt})$`);
};
alert(PhoneEuropeRegExp().test("+420123456789"))
Essayez ceci, je ne sais pas s'il y a un numéro de téléphone plus long que 12:
^(00|\+){1}\d{12}$
^(00|\+){1}\d{12,15}$
alors?