Quais caracteres especiais devem ser permitidos para um número de telefone?

20

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:

  1. 1800123456 (Índia)
  2. 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?

guarda
fonte
1
E os números de telefone expressos com letras, por exemplo, 0800DIALTHIS?
Mouviciel
3
O que você está tentando impedir? O usuário mentindo? O usuário não quer que você saiba o número deles? O usuário está com preguiça de inserir alguma coisa? O usuário está digitando um erro de digitação?
Benjol
@ mouviviel: sim, também preciso pensar em tomar um cenário de validação de cada vez, para que eu pense sobre isso.
Ranger
@ Benjol: Esta aplicação é comercial, por isso não podemos arriscar em nossos clientes, eu sei que um usuário digitará um número correto, mas e se ele / ela não o fizer. A validação é muito importante, pois economiza aplicativos, não apenas erros de digitação. Não quero que meu banco de dados seja preenchido com lixo inútil.
Ranger
5
bem, o que você está fazendo para validar os endereços de e-mail deles? Você observará que quase todos os sites fazem validação da "vida real" (por exemplo, enviando um e-mail para você). Eu acho que se o número de telefone é tão importante, você precisa fazer algo equivalente.
Benjol

Respostas:

21

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.

P Shved
fonte
7
+1 para "os usuários só queriam transmitir uma informação importante". Muitas vezes vi validação desnecessária que simplesmente irrita o usuário sem nenhum requisito técnico (ou organizacional).
perdian
6
+1 - a validação de número de telefone (especialmente definida de maneira geral) geralmente não faz sentido, não é preparada para o futuro (o KL5-6743 costumava ser um número de telefone válido, por exemplo) e apenas irrita os usuários que têm casos especiais. Torne os números de telefone um grande campo de texto e permita que os discadores automáticos (se houver algum nesse cenário) analisem o que puderem. As exceções podem ser levantadas para seres humanos que podem lidar com a situação adequadamente.
EZ Hart
8
+1 e mais importante só porque um número de telefone é válido, isso não significa que ele existe, e mesmo se ele existe, isso não significa que ele pertence à pessoa em questão ...
Benjol
Ah, sim, vou descobrir os países onde nossos principais usuários vivem e depois escreverei algum código de validação. Obrigado a todos, eu aprecio seus esforços.
Ranger
4
@ Ranger Esse é exatamente o oposto do que a resposta estava chegando.
Sebastian Redl
7

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:

  • 06 12 34 56 78
  • 0612345678
  • 06.12.34.56.78
  • 06-12-34-56-78
  • +33612345678
  • +33 (0) 6 12 34 56 78

os dois últimos sendo a forma internacional.

Em geral:

  1. Permitir colchetes, +símbolo apenas como um caractere à esquerda, traços, pontos, vírgulas e espaços.
  2. Se possível, lembre-se apenas da forma normalizada (ou seja, +33 (0) 612345678).
  3. Se isso não for possível, remova pelo menos os caracteres separadores (como 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.

Arseni Mourzenko
fonte
1
Ajudaria a mostrar o uso dos colchetes em seus exemplos. Os números internacionais costumam usá-los para incluir o zero inicial do código de área para indicar que você não o disca ao ligar do exterior. Por exemplo, +31 (0)30 1234567onde 31 é a Holanda, 030 é o código de área e 1234567 é o assinante.
Marjan Venema
2
Não se esqueça de um campo opcional para o código de extensão (que pode precisar permitir a chave da libra ou do asterisco).
rwong
@MarjanVenema, eu não faço muita discagem internacional, mas é padrão adicionar o zero e adicionar colchetes (0) para dizer para você NÃO discar? Não seria mais simples deixar de fora o 0 completamente?
CaffGeek
@ Chade: Não. Diz aos usuários internacionais que eles precisam deixar de fora e informa aos usuários nacionais que eles precisam usá-lo. Nem todos os países têm códigos de área começando com um zero. Fazer isso dessa maneira garante que, quando alguém vê o número, eles sabem o que fazer quando estão dentro e fora do país. Nem todo mundo chamando nacional precisa ser um residente depois de tudo ...
Marjan Venema
@MarjanVenema, oh, entendi, não percebeu que os usuários nacionais precisavam disso, aprendeu algo novo hoje.
CaffGeek 3/12/12
3

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.

Andy Canfield
fonte
2
+100. Não há nada pior do que um computador dizendo "remova o - do número", como se o computador não tivesse idéia de como fazer isso sozinho. O mesmo para números de cartão de crédito, FWIW.
Bryan Oakley
0

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.)

rwong
fonte
3
Você está esquecendo o sinal + \ para o acesso internacional
Marjan Venema
2
permita também a letra x - pelo menos nos EUA, é comum prefixar uma extensão com um x (por exemplo: 555-1212 x123).
Bryan Oakley
0

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.

Todd Main
fonte
1
Não concordo em garantir que nenhuma carta seja aceita - vá em frente e aceite o aviso e depois as ignore. As pessoas escrevem naturalmente extensões com um "x" inicial (por exemplo: 555-1212 x123). Por que não permitir isso? Os seres humanos podem analisá-lo perfeitamente e, se o computador precisar usá-lo, pode remover os não dígitos trivialmente.
Bryan Oakley
0

O Google tem lib para isso:

Biblioteca comum Java, C ++ e JavaScript do Google para analisar, formatar e validar números de telefone internacionais.

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.

Christophe Roussy
fonte