Regex Swiss phone number
A Swiss number has 9 digits after the trunk 0 (dropped with +41): a 2-digit area code (021 Lausanne, 022 Geneva, 031 Bern, 044 Zurich) then 7 digits for a landline, 07x for a mobile (075 to 079), then 0800 (toll-free), 084x and 090x. People write '021 345 67 89' or '+41 79 123 45 67'. validator.js's regex accepts '0' followed by 2 to 10 arbitrary digits; Drupal's strips separators then does not anchor the start; sent.dm's requires a 4-3-2-2 layout that almost nobody writes. Here's a pattern enforcing 9 digits and existing prefixes, compared against those attempts.
/^(?:(?:\+|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})$/passes 33/33 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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.
Phone numbers for other countries
- Australian phone number
- Belgian phone number
- Brazilian phone number
- Canadian phone number
- Chinese phone number
- Dutch phone number
- French phone number
- German phone number
- Italian phone number
- Japanese phone number
- Mexican phone number
- Norwegian phone number
- Polish phone number
- South African phone number
- Spanish phone number
- Swedish phone number
- UK phone number
- US phone number
- All phone numbers by country