Estou projetando uma página da Web que será usada por usuários globais, incluindo usuários do Canadá, EUA, Índia, Reino Unido etc. Preciso aplicar validações para esse campo de número de telefone, mas não tenho certeza da melhor maneira de fazer isso. .
Alguns dos formatos válidos em que consigo pensar são:
- 1800123456 (Índia)
- uso de "-" em números de telefone nos EUA
Estou um pouco confuso sobre quais caracteres especiais devo permitir que um usuário insira (por exemplo - / ()
). Como outros resolveram isso no passado?
Respostas:
Só porque você pode restringir algo (é para isso que você é pago, como programador, para escrever código), isso não significa que você realmente deve fazer isso.
Qual é o sentido de validar um número? Por que é útil? Irá falhar se um usuário digitar "0800DIALTHIS" ou "私 は 電話 番号 持 っ て い な い" ou "(499) 123-45-67 добавочный 4425"? Certamente o fará (você diz "global". Não é?), Enquanto os usuários só querem transmitir informações importantes sobre como entrar em contato com eles por telefone.
Além disso, a maneira como os dados são armazenados deve ser regida pela maneira como são usados. Como você vai usar os números? Eles serão usados para enviar spam por SMS automaticamente ou serão discados manualmente pelos gerentes? Se for o último, não há problema em permitir caracteres adicionais, pois o cérebro humano será capaz de analisá-los da maneira que acharem mais apropriada; e, nesse caso, você realmente não precisa de validações, o que apenas irritará usuários humanos.
fonte
Seria muito difícil saber se um número é válido ou não, pois diferentes países têm formatos diferentes. Na França, por exemplo, 06 12 34 56 78 é um número de telefone válido, enquanto 00 12 34 56 78 não é, pois o número pode começar apenas de 01 a 09, 06 e 07 como telefones celulares.
Além disso, os números de telefone podem ser escritos em vários formatos, mesmo no mesmo país. Eu tenho visto:
os dois últimos sendo a forma internacional.
Em geral:
+
símbolo apenas como um caractere à esquerda, traços, pontos, vírgulas e espaços.Não é recomendável aprofundar a validação por país. Não apenas existe uma grande quantidade de regras, mas também as regras mudam. Por exemplo, na França, há alguns anos atrás, não havia números de telefone começando em 07 ou 09. Com o número crescente de telefones celulares aparecendo 07. Com serviços de VoIP, apareceu 09.
Você também pode levar em consideração números especiais. Por exemplo, 3635 é um número válido na França, mesmo que contenha apenas quatro dígitos e comece com um diferente de zero.
fonte
+31 (0)30 1234567
onde 31 é a Holanda, 030 é o código de área e 1234567 é o assinante.NÃO restrinja os caracteres; pegue tudo o que ele lhe der. Mas quando você discar, pegue apenas os dígitos. Mesmo assim, pode funcionar errado. Eu estava na Tailândia um ano antes de saber que 123-4567-9 não significava um ramal, mas um intervalo de números, 1234567 a 1234569. Quando disquei "12345679", funcionou, porque a companhia telefônica ignorou o dígito extra. Pegue qualquer coisa, disque apenas dígitos.
Adoro que meu novo telefone permita espaços no número de telefone. Eu posso inserir "123 456 7890" assim, nem todos juntos.
fonte
Suportes, traço e espaço.
Depois que o usuário digitar o número de telefone que contém esses símbolos, você poderá validá-los de acordo com as regras específicas do país (que serão necessárias para reunir essas regras para cada país) e, em seguida, os que não sejam dígitos poderão ser eliminados quando é processado internamente em seu software.
Isso ocorre porque o IDD (discagem direta internacional) torna impossível exigir que "caracteres especiais" sejam realmente usados na discagem de um número, com exceção de pausas na digitação dos dígitos.
(Não tenho conhecimento disso; corrija-me se estiver errado.)
fonte
A única coisa que deve ser validada é o número de dígitos - corresponde ao que você precisa chamar?
Os códigos de acesso não podem / não devem ser permitidos por um usuário (ou seja, +1 nos EUA). Vou lhe dizer por que - se é um americano que entra e não é tão experiente, provavelmente deseja inserir 001 em vez de 1. O motivo é que 00 é como você acessa um número internacional de dentro dos EUA. Eles não sabem qual é a diferença entre isso e apenas +1. Se você estiver ligando para telefones fixos entre códigos de área (e às vezes no mesmo código de área), também digitará 1 antes desse número. Assim como o Japão.
Veja o Japão. As linhas terrestres provinciais são acessadas com um 0 na frente delas. Mas se você estiver discando de fora do Japão, não precisará desse 0.
Os números de celular na China têm 10 dígitos e em Hong Kong, 8. Se o formulário captura o país, nem peça o código do país no início do número - apenas o mostre automaticamente em texto somente leitura, ao lado de o número que eles precisam inserir.
A lista continua.
Apenas valide o número de dígitos (verifique se nenhuma letra é aceita) e facilite para o usuário final digitar o número certo de dígitos. Ou seja, eles não precisam digitar o código do país e, se seu formulário for super inteligente, talvez nem precisem digitar o código de área se for um número de telefone fixo. Ou, se eles começarem a digitar coisas como um código de acesso, como 0 na frente de um número japonês, informe-os de que não precisam.
Todos os outros caracteres, além dos dígitos, devem ser um ponto discutível - eles não têm chance de inseri-los.
fonte
O Google tem lib para isso:
https://github.com/googlei18n/libphonenumber
Faz o melhor esforço, acho que deve haver casos que não são tratados, pois isso não é de modo algum uma tarefa fácil. Permita que os usuários insiram números e letras, remova as letras posteriormente com o código.
fonte