[\d -]{1}
est manifestement incorrect : un chiffre OU un espace OU un trait d'union.
01000 123456
01000 n'est pas un indicatif régional valide au Royaume-Uni. 123456 n'est pas un numéro local valide.
Il est important que les données d'essai soient des indicatifs régionaux réels et des tranches de numéros réelles.
^\s*(?(020[7,8]{1})?[ ]?[1-9]{1}[0-9{2}[ ]?[0-9]{4})|(0[1-8]{1}[0-9]{3})?[ ]?[1-9]{1}[0-9]{2}[ ]?[0-9]{3})\s*|[0-9]+[ ]?[0-9]+$
Le schéma ci-dessus est un déchet pour de nombreuses raisons différentes.
[7,8] correspond à 7 ou à une virgule ou à 8. Il n'est pas nécessaire de faire correspondre une virgule.
Les nombres londoniens commencent également par 3 et pas seulement par 7 ou 8.
Les numéros 020 de Londres ne sont pas les seuls numéros au format 2+8 ; voir aussi 023, 024, 028 et 029.
[1-9]{1} se simplifie en [1-9].
[ ] ? se simplifie en \s ?
Après avoir trouvé le 0 initial une fois, pourquoi continuer à le chercher encore et encore ?
^(0....|0....|0....|0....)$ se simplifie en ^0(....|....|....|....|....)$.
Sérieusement. ([1]|[2]|[3]|[7]){1} se simplifie en [1237] ici.
Les numéros de téléphone britanniques utilisent une variété de formats : 2+8, 3+7, 3+6, 4+6, 4+5, 5+5, 5+4. Certains utilisateurs ne savent pas quel format correspond à quelle plage de numéros et peuvent utiliser le mauvais format lors de la saisie. Laissez-les faire ; ce qui vous intéresse, ce sont les DIGITS.
Étape 1 : Vérifier que le format d'entrée semble valide
Veillez à ce que la saisie ressemble à un numéro de téléphone britannique. Acceptez divers préfixes de numérotation, +44, 011 44, 00 44 avec ou sans parenthèses, tirets ou espaces ; ou le format national avec un 0 en tête. Laissez l'utilisateur utiliser le format qu'il souhaite pour le reste du numéro : (020) 3555 7788 ou 00 (44) 203 555 7788 ou 02035-557-788 même si ce n'est pas le bon format pour ce numéro particulier. Ne vous inquiétez pas des parenthèses non équilibrées. La partie importante de la saisie est de s'assurer que le nombre de chiffres est correct. La ponctuation et les espaces n'ont pas d'importance.
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$
Le modèle ci-dessus correspond à des parenthèses ouvrantes facultatives, suivies de 00 ou 011 et de parenthèses fermantes facultatives, suivies d'un espace ou d'un trait d'union facultatif, suivi de parenthèses ouvrantes facultatives. Ou bien, les parenthèses ouvrantes initiales sont suivies d'un + littéral sans espace ou trait d'union suivant. L'une ou l'autre des deux options précédentes est ensuite suivie de 44 avec des parenthèses fermantes facultatives, suivi d'un espace ou d'un trait d'union facultatif, suivi de 0 entre parenthèses facultatives, suivi d'un espace ou d'un trait d'union facultatif, suivi de parenthèses ouvrantes facultatives (format international). Sinon, le modèle correspond à des parenthèses ouvrantes initiales facultatives suivies du code tronc 0 (format national).
La partie précédente est ensuite suivie du NDC (indicatif régional) et du numéro de téléphone de l'abonné au format 2+8, 3+7, 3+6, 4+6, 4+5, 5+5 ou 5+4 avec ou sans espaces et/ou tirets. Il est également possible de prévoir des parenthèses fermantes facultatives et/ou un espace ou un trait d'union facultatif après l'endroit où l'utilisateur pense que l'indicatif régional se termine et où le numéro d'abonné local commence. Le modèle permet d'utiliser n'importe quel format avec n'importe quel numéro de GB. Le format d'affichage doit être corrigé par une logique ultérieure si l'utilisateur a utilisé un format incorrect pour ce numéro lors de la saisie.
Le motif se termine par un numéro d'extension facultatif sous la forme d'un espace ou d'un tiret facultatif suivi de x, ext et d'un point facultatif, ou #, suivi des chiffres du numéro d'extension. L'ensemble du modèle ne prend pas la peine de vérifier si les parenthèses sont équilibrées, car elles seront supprimées du numéro à l'étape suivante.
A ce stade, vous ne vous souciez pas de savoir si le numéro commence par 01 ou 07 ou autre chose. Vous ne vous souciez pas non plus de savoir s'il s'agit d'un indicatif régional valide. Les étapes suivantes traiteront de ces questions.
Étape 2 : Extraire la DSN afin de pouvoir vérifier plus en détail sa longueur et sa portée.
Après avoir vérifié que l'entrée ressemble à un numéro de téléphone GB à l'aide du modèle ci-dessus, l'étape suivante consiste à extraire la partie NNO afin d'en vérifier plus en détail la validité, puis de la formater de la manière appropriée pour la plage de numéros applicable.
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)(?:((?:x|ext\.?\s?|\#)\d+)?)$
Utilisez le modèle ci-dessus pour extraire le '44' de $1 afin de savoir si le format international a été utilisé, sinon supposez le format national si $1 est nul.
Extraire les détails du numéro d'extension facultatif de 3 $ et les stocker pour une utilisation ultérieure.
Extraire le NNO (y compris les espaces, les traits d'union et les parenthèses) de $2.
Étape 3 : Validation de la DSN
Supprimez les espaces, les traits d'union et les parenthèses de $2 et utilisez d'autres modèles RegEx pour vérifier la longueur et la plage et identifier le type de nombre.
Ces modèles seront beaucoup plus simples, puisqu'ils n'auront pas à composer avec divers préfixes de numérotation ou codes de pays.
Le modèle permettant de faire correspondre des numéros de téléphone mobile valides est donc aussi simple que
^7([45789]\d{2}|624)\d{6}$
Le taux de prime est de
^9[018]\d{8}$
Il y aura un certain nombre d'autres modèles pour chaque type de numéro : lignes fixes, tarifs professionnels, non géographiques, VoIP, etc.
En décomposant le problème en plusieurs étapes, il est possible d'autoriser un très large éventail de formats d'entrée et de vérifier de manière très détaillée la plage de numéros et la longueur de la DSN.
Étape 4 : Enregistrez le numéro
Une fois le NNO extrait et validé, enregistrez le numéro avec le code pays et tous les autres chiffres sans espace ni ponctuation, par exemple 442035557788.
Étape 5 : Formater le numéro pour l'affichage
Un autre ensemble de règles simples peut être utilisé pour formater le numéro avec le +44 ou le 0 requis ajouté au début.
La règle pour les numéros commençant par 03 est
^44(3\d{2})(\d{3])(\d{4})$
formaté comme suit
0$1 $2 $3 or as +44 $1 $2 $3
et pour les numéros commençant par 02, c'est
^44(2\d)(\d{4})(\d{4})$
formaté comme suit
(0$1) $2 $3 or as +44 $1 $2 $3
La liste complète est assez longue. Je pourrais la copier et la coller dans ce fil de discussion, mais il serait difficile de maintenir cette information à plusieurs endroits au fil du temps. Pour l'instant, la liste complète se trouve à l'adresse suivante : http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers