Eu também sugeriria examinar a Biblioteca do Google " libphonenumber ". Eu sei que não é regex, mas faz exatamente o que você deseja.
Por exemplo, ele reconhecerá que:
15555555555
é um número possível, mas não é um número válido. Ele também suporta países fora dos EUA.
Destaques da funcionalidade:
- Análise / formatação / validação de números de telefone para todos os países / regiões do mundo.
getNumberType
- obtém o tipo do número com base no próprio número; capaz de distinguir números de telefone fixo, móvel, gratuito, tarifa premium, custo compartilhado, VoIP e pessoal (sempre que possível).
isNumberMatch
- obtém um nível de confiança sobre se dois números podem ser iguais.
getExampleNumber
/ getExampleNumberByType
- fornece números de exemplo válidos para todos os países / regiões, com a opção de especificar qual tipo de número de telefone de exemplo é necessário.
isPossibleNumber
- adivinhar rapidamente se um número é um número de telefone possível usando apenas as informações de comprimento, muito mais rápido que uma validação completa.
isValidNumber
- validação completa de um número de telefone para uma região usando informações de comprimento e prefixo.
AsYouTypeFormatter
- formata os números de telefone rapidamente quando os usuários digitam cada dígito.
findNumbers
- encontra números na entrada de texto.
PhoneNumberOfflineGeocoder
- fornece informações geográficas relacionadas a um número de telefone.
Exemplos
O maior problema com a validação de número de telefone é que é muito culturalmente dependente.
- América
(408) 974–2042
é um número americano válido
(999) 974–2042
não é um número válido dos EUA
- Austrália
0404 999 999
é um número australiano válido
(02) 9999 9999
também é um número australiano válido
(09) 9999 9999
não é um número australiano válido
Uma expressão regular é adequada para verificar o formato de um número de telefone, mas não será capaz de verificar a validade de um número de telefone.
Eu sugeriria pular uma expressão regular simples para testar seu número de telefone e usar uma biblioteca como a do Google libphonenumber
(link para o projeto GitHub) .
Apresentando libphonenumber!
Usando um de seus exemplos mais complexos 1-234-567-8901 x1234
, você obtém os seguintes dados libphonenumber
(link para a demonstração online) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Portanto, você não apenas aprende se o número de telefone é válido (qual é), mas também obtém uma formatação consistente de número de telefone no seu local.
Como bônus, libphonenumber
possui vários conjuntos de dados para verificar a validade dos números de telefone, assim, verificar um número como +61299999999
(a versão internacional de (02) 9999 9999
) retorna como um número válido com formatação:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
O libphonenumber também oferece muitos benefícios adicionais, como escolher o local em que o número de telefone foi detectado e também obter as informações de fuso horário no número de telefone:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Mas o número de telefone australiano inválido ( (09) 9999 9999
) retorna que não é um número de telefone válido.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
A versão do Google possui código para Java e Javascript, mas as pessoas também implementaram bibliotecas para outros idiomas que usam o conjunto de dados de números de telefone do Google i18n:
A menos que você tenha certeza de que sempre aceitará números de um código de idioma e eles sempre estarão em um formato, eu sugiro que não escreva seu próprio código para isso e use libphonenumber para validar e exibir números de telefone.