2010-12-09 20 views
3

J'ai besoin d'une expression régulière pour faire correspondre les numéros de téléphone. Je veux juste savoir si le numéro est probablement un numéro de téléphone et il pourrait être n'importe quel format de téléphone, américain ou international. J'ai donc développé une stratégie pour déterminer si elle correspond.Expression régulière pour faire correspondre un numéro de téléphone

Je souhaite accepter les caractères suivants: 0-9 ainsi que ,.()- et éventuellement commencer par + (pour les numéros internationaux). La chaîne ne doit pas correspondre si elle a d'autres caractères.

J'ai essayé ceci:

/\+?[0-9\/\.\(\)\-]/ 

Mais il correspond à des numéros de téléphone qui ont + au milieu du nombre. Et il correspond à des nombres qui contiennent des caractères alpha (je ne veux pas ça).

Enfin, je veux définir la longueur minimale à 9 caractères.

Des pensées?

Merci pour toute aide, je suis évidemment pas trop rapide sur des choses RegEx :)

+0

Malheureusement, ne permettre que des numéros qui seront un numéro de téléphone valide est très gênant quand il s'agit d'international. La longueur et le style des numéros internationaux varient considérablement. Il est cependant possible de dire que vous voulez un nombre de 9 chiffres ou plus comme il l'a fait ci-dessous. – m4tt1mus

+0

duplication possible de [Une regex complète pour la validation du numéro de téléphone] (http://stackoverflow.com/questions/123559/a-comprehensive-regex-for-phone-number-validation) – Mark

Répondre

4

Eh bien, vous êtes assez proche. Essayez ceci:

^\+?[0-9\/.()-]{9,}$ 

Sans les ancres de début et de fin vous permettent une correspondance partielle, il peut donc correspondre +123 de la chaîne :-)+123.

Si vous voulez un minimum de 9 chiffres , plutôt que des caractères (si ---.../// est pas valide), vous pouvez utiliser:

^\+?[\/.()-]*([0-9][\/.()-]*){9,}$ 

ou, en utilisant un test avant - avant correspondant à la chaîne pour [0-9/.()-]* le moteur regex recherche (\D*\d){9}, qui est un de 9 chiffres, chaque chiffre éventuellement précédé par d'autres caractères (que nous validerons plus tard).

^\+?(?=(\D*\d){9})[0-9\/.()-]*$ 
+1

+1 Ceci répond aux critères énoncés dans la question. La norme ITU qui définit la numérotation téléphonique vaut probablement la peine d'être mentionnée: http://en.wikipedia.org/wiki/E.164 – msw

+0

Remarque - Vous devrez peut-être échapper les barres obliques en utilisant '\ /' - j'ai halluciné le '.net' tag, donc je ne l'ai pas inclus. En fait, je vais l'ajouter juste pour être sûr. – Kobi

+0

Cela ne fonctionnera pas réellement parce que vous n'avez pas échappé le()/ou. correctement. Au moins, cela ne fonctionnera pas dans les langues que j'ai utilisées. Bien que la syntaxe soit correcte. – m4tt1mus

1

La raison pour laquelle il correspond au caractère alpha est due à la période. Vous devez y échapper. Je ne sais pas ce que l'éditeur que vous utilisez pour cela, c'est ce que je vais utiliser pour VIM:

^+\?[()\-\.]\?\([0-9][\.()\-]\?\)\{3,\}$ 
+0

J'ai peur que ce ne soit pas vrai. Vous n'êtes pas obligé d'échapper le point dans une classe de caractères ('[.]'). En outre, vous ne devriez pas échapper '?', '{' Et '}' dans votre regex, mais devrait échapper '+'. – Kobi

+0

Vous avez raison sur le point d'échappement, mais je dois échapper?, {Et} pour VIM. Je ne sais pas ce que vous utilisez pour écrire une regex, donc je ne fais que donner mes connaissances basées sur VIM. – nikeairj

+0

Variation très intéressante - elle semble opposée au début, mais elle a du sens. – Kobi

0

Le juqeury a un plugin pour la validation de téléphone américain. Cochez cette case link. Vous pouvez également voir l'expression régulière dans le code source.

Questions connexes