Regex numéro de téléphone canadien
Le Canada partage le plan de numérotation nord-américain (NANP) avec les États-Unis : +1, un indicatif régional de 3 chiffres, un code d'échange de 3 chiffres qui ne commence ni par 0 ni par 1, puis 4 chiffres. Ce qui distingue un numéro canadien est la liste des indicatifs régionaux (204, 416, 514, 604, 613…) : les regex de jquery-validation et de validator.js acceptent n'importe quel indicatif de format NANP, donc « (212) 555-0123 » (New York) passe comme numéro canadien. Le plan réserve 555-0100 à 555-0199 aux œuvres de fiction : « 416 555 0123 » est un bon exemple de test. Voici un motif qui limite les indicatifs aux indicatifs canadiens connus de libphonenumber, comparé à ces tentatives.
/^(?:(?:\+1|1)[ .-]?)?(?:(?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))|\((?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))\))[ .-]?[2-9][0-9]{2}[ .-]?[0-9]{4}$/passe 34/34 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| jquery-validation (phoneUS) — le plugin retire d'abord les espaces ; testée telle quelle, la regex rejette « 416 555 0123 » ; n'importe quel indicatif NANP américain passe (« 212-555-0123 », « (305)555-0123 ») ; « 1 » et « +1 » acceptés avec un tiret | ^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$ | 22 / 34 | sûr |
| validator.js (en-CA, simple alias de en-US) — aucun contrôle de l'indicatif : « (212) 555-0123 » et « +1 305 555 0123 » passent ; refuse les points (« 416.555.0123 ») et les parenthèses non appariées ; accepte des formats mêlés comme « (416) 5550123 » | ^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$ | 30 / 34 | sûr |
| sent.dm (guide du fournisseur, regex Canada) — « +1 » obligatoire et sans séparateur : tout format local (« 416-555-0123 ») est rejeté ; aucun contrôle de l'indicatif régional (« +12125550123 » passe) | ^\+1[2-9]\d{2}[2-9]\d{2}\d{4}$ | 18 / 34 | sûr |
Implémentation
const re = new RegExp("^(?:(?:\\+1|1)[ .-]?)?(?:(?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))|\\((?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))\\))[ .-]?[2-9][0-9]{2}[ .-]?[0-9]{4}$", "");
re.test(input);Limites
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Seuls l'indicatif régional (liste de libphonenumber, qui peut prendre du retard sur les nouveaux indicatifs et superpositions) et le premier chiffre 2-9 du code d'échange sont contrôlés ; les numéros 555-01xx sont des numéros fictifs, mais le motif les accepte comme n'importe quel autre.
- Un indicatif américain voisin (« 212 », « 305 ») est rejeté ; en revanche des indicatifs non canadiens attribués après la version de libphonenumber utilisée seraient rejetés à tort, et l'inverse pour de futurs indicatifs canadiens.
- Le préfixe +1 ou 1 est facultatif. Séparateur facultatif : espace, point ou tiret entre les trois blocs ; « 416-555.0123 » (mélangé) passe. Les extensions (« ext 5 », « x5 ») sont rejetées : le motif de telephone-us les accepte.
- Les numéros gratuits (800, 833, 844, 855, 866, 877, 888) sont acceptés, sans distinction du pays : ils sont communs aux États-Unis et au Canada.
Numéros de téléphone d’autres pays
- numéro de téléphone allemand
- numéro de téléphone américain
- numéro de téléphone australien
- numéro de téléphone belge
- numéro de téléphone brésilien
- numéro de téléphone britannique
- numéro de téléphone chinois
- numéro de téléphone espagnol
- numéro de téléphone français
- numéro de téléphone italien
- numéro de téléphone japonais
- numéro de téléphone mexicain
- numéro de téléphone néerlandais
- numéro de téléphone norvégien
- numéro de téléphone polonais
- numéro de téléphone sud-africain
- numéro de téléphone suédois
- numéro de téléphone suisse
- Tous les numéros de téléphone par pays