Regex numéro de téléphone suisse
Un numéro suisse compte 9 chiffres après le 0 de tronc (supprimé avec +41) : indicatif de 2 chiffres (021 Lausanne, 022 Genève, 031 Berne, 044 Zurich) puis 7 chiffres pour un fixe, 07x pour un mobile (075 à 079), puis 0800 (gratuit), 084x et 090x. On écrit « 021 345 67 89 » ou « +41 79 123 45 67 ». La regex de validator.js accepte « 0 » suivi de 2 à 10 chiffres quelconques ; celle de Drupal retire les séparateurs puis ne ré-ancre pas le début ; celle de sent.dm exige un format en 4-3-2-2 que presque personne n'écrit. Voici un motif qui impose 9 chiffres et des préfixes existants, comparé à ces tentatives.
/^(?:(?:\+|00)41 ?|0)(?:(?:2[12467]|3[1-4]|4[134]|5[12568]|6[1289]|7[1-35-9]|81|91)(?:[ -]?[0-9]){7}|74[0248](?:[ -]?[0-9]){6}|800(?:[ -]?[0-9]){6}|84[0248](?:[ -]?[0-9]){6}|878(?:[ -]?[0-9]){6}|90[016](?:[ -]?[0-9]){6})$/passe 33/33 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js (de-CH, alias fr-CH et it-CH) — « 0 » + [1-9] + 1 à 9 chiffres : de 2 à 10 chiffres après le 0 passent (« 012 », « 01234567890 ») ; aucun séparateur (« 079 123 45 67 » rejeté) ; préfixes inexistants (« 0701234567 » passe) | ^(\+41|0)([1-9])\d{1,9}$ | 19 / 33 | sûr |
| Drupal phone (7.x-1.x, phone.ch.inc, regex PHONE_CH_REGEX) — la fonction retire d'abord espaces, tirets, points, barres et parenthèses ; testée telle quelle, la regex n'est pas ancrée au début : « abc0212345678 » passe ; 2-9 en tête sans contrôle du préfixe | (\+41|0|0041)([2-9]\d{8})$ | 19 / 33 | sûr |
| sent.dm (guide du fournisseur, cinq regex réunies par |) — format 4-3-2-2 pour les fixes (« 0212 345 67 89 ») et les mobiles ; « 021 345 67 89 » rejeté ; premiers chiffres 0[2-5] sans contrôle | ^0[2-5][0-9]{2} [0-9]{3} [0-9]{2} [0-9]{2}$|^07[5-9][0-9]{2} [0-9]{3} [0-9]{2} [0-9]{2}$|^0800 [0-9]{3} [0-9]{3}$|^090[0-6] [0-9]{3} [0-9]{3}$|^084[0-8] [0-9]{3} [0-9]{3}$ | 16 / 33 | sûr |
Implémentation
const re = new RegExp("^(?:(?:\\+|00)41 ?|0)(?:(?:2[12467]|3[1-4]|4[134]|5[12568]|6[1289]|7[1-35-9]|81|91)(?:[ -]?[0-9]){7}|74[0248](?:[ -]?[0-9]){6}|800(?:[ -]?[0-9]){6}|84[0248](?:[ -]?[0-9]){6}|878(?:[ -]?[0-9]){6}|90[016](?:[ -]?[0-9]){6})$", "");
re.test(input);Limites
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Les préfixes de 2 chiffres suivent libphonenumber ; seul le plan de l'OFCOM (RS 784.101.113/2.2), dont le texte n'a pas pu être relu ici, fait foi pour les blocs attribués.
- Après +41 ou 0041, le 0 de tronc ne doit pas être gardé : « +41 021… » est rejeté. Le préfixe 860 (messagerie vocale, 12 chiffres) est rejeté, et les préfixes 5x sont limités à 51, 52, 55, 56 et 58.
- La longueur de 9 chiffres après le 0 vient de libphonenumber, non du texte du plan de l'OFCOM, qui n'a pas pu être relu.
- Une espace ou un tiret facultatifs sont acceptés entre deux chiffres quelconques ; les points, barres obliques, parenthèses et extensions sont rejetés.
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 canadien
- 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
- Tous les numéros de téléphone par pays