Regex numéro de téléphone britannique
Ofcom publie des numéros fictifs réservés aux œuvres de fiction, par exemple 020 7946 0xxx ou 07700 900xxx. Ce sont de bons exemples de test, car ils ont la vraie structure du plan de numérotation. La regex de jquery-validation la plus stricte (phonesUK) les rejette pourtant dès que l'on sort des fixes et des mobiles : elle exclut volontairement 08 et 09, donc « 08081 570123 » (numéro gratuit fictif) et « 0909 8790123 » (surtaxé fictif) échouent, tout comme 070 (numéros personnels). La regex mobile de validator.js refuse tout fixe. Voici un motif qui suit les préfixes d'Ofcom (01, 02, 03, 05, 07, 08, 09), avec +44 sans le 0 de tronc, comparé à ces tentatives.
/^(?:(?:\+44|0044)[ -]?|0)(?:(?=(?:[ -]?[0-9]){10}$)(?:7[1-57-9]|7624|70|55|56)(?:[ -]?[0-9])+|(?=(?:[ -]?[0-9]){9,10}$)[12389](?:[ -]?[0-9])+)$/passe 35/35 cas
Comparatif des patterns existants
Implémentation
const re = new RegExp("^(?:(?:\\+44|0044)[ -]?|0)(?:(?=(?:[ -]?[0-9]){10}$)(?:7[1-57-9]|7624|70|55|56)(?:[ -]?[0-9])+|(?=(?:[ -]?[0-9]){9,10}$)[12389](?:[ -]?[0-9])+)$", "");
re.test(input);Limites
- Valide seulement la FORME : ne vérifie pas que le numéro est alloué. Les plages 01 et 02 acceptent n'importe quel indicatif de zone (« 01234 567890 » passe) : seule l'annexe A du plan d'Ofcom, que ce motif ne reprend pas, liste les indicatifs réels.
- Les longueurs (9 ou 10 chiffres après le 0 de tronc, exactement 10 pour les préfixes mobiles, 055, 056 et 070) viennent des métadonnées de libphonenumber, pas du plan d'Ofcom, qui ne les donne pas. Le 076 (radiomessagerie) est exclu, sauf 07624 (île de Man).
- Accepte espace ou tiret facultatifs entre les chiffres, mais ni parenthèses (« (020) 7946 0123 ») ni extension (« x123 ») : retirez-les avant validation. Après +44 ou 0044, le 0 de tronc ne doit pas être gardé (« +44 020… » est rejeté).
- Les numéros du corpus sont les numéros fictifs officiels d'Ofcom (copie Wayback de la page « numbers for drama ») : utilisables librement dans des tests, contrairement à de vrais numéros.