Um índice abrangente para a validação de números de telefone

Estou a tentar criar um registo completo para validar números de telefone. Idealmente, lidaria com formatos internacionais, mas deve lidar com formatos dos EUA, incluindo o seguinte:

  • 1-234-567-8901
  • 1-234 -67-8901 x1234
  • 1 -34 -67-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901
Vou responder com a minha tentativa actual, mas espero que alguém tenha algo melhor e / ou mais. elegante.

Author: Nicholas Trandem, 2008-09-24

30 answers

Melhor opção... apenas tira todos os caracteres não numéricos na entrada (excepto o 'x' e liderança '+' sinais), tendo o cuidado devido Britânico tendência para escrever números no formulário não padrão +44 (0) ... quando solicitado a usar o prefixo de marcação internacional (neste caso específico, você deve descartar o (0) inteiramente).

Depois, acabas com valores como:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

Então, quando você mostrar, reformate para o seu coração conteúdo. por exemplo

  1 (234) 567-8901
  1 (234) 567-8901 x1234
 487
Author: scunliffe, 2016-03-10 10:47:57
Parece que há uma espécie de especificação para isto, pelo menos para a América do Norte, chamada NANP . Precisas de especificar exactamente o que queres. O que são delimitadores legais? Espaços, traços e períodos? Não é permitido delimitador? Pode-se misturar delimitadores (por exemplo, +0.111-222.3333)? Como as extensões (por exemplo, 111-222-3333 x 44444) vão ser tratadas? E números especiais, como o 112? O código de área será opcional ou obrigatório? Aqui está um regex para um 7. ou número de 10 dígitos, com extensões Permitidas, os delimitadores são espaços, traços ou períodos:
^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$
 281
Author: fatcat1111, 2010-09-01 22:06:55
.*
Se o utilizador quiser dar-lhe o número de telefone, confie nele para acertar. Se ele não quiser dar-lhe, em seguida, forçá-lo a entrar um número válido, ou enviá-lo para o site de um concorrente ou fazê-lo entrar uma cadeia aleatória que se encaixa no seu regex. Posso até sentir-me tentado a procurar o número de uma linha de sexo premium e entrar nisso em vez disso.

Eu também consideraria qualquer uma das seguintes entradas válidas num site:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"
 278
Author: Dave Kirby, 2012-10-18 19:37:33
Eu também sugeriria olhar para a Biblioteca do Google" libphonenumber ". Sei que não é regex, mas faz exactamente o que queres.

Por exemplo, reconhecerá que:

15555555555

É um número possível, mas não um número válido. Também apoia países fora dos EUA.

Destaques de funcionalidade:

  • analisar/formatar/validar números de telefone para todos os países / regiões do mundo.
  • - Get o tipo do número baseado no próprio número; capaz de distinguir linha fixa, móvel, sem portagem, taxa de prémio, custo compartilhado, VoIP e números pessoais (sempre que possível).
  • - 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 que tipo de número de telefone exemplo é necessário.
  • - Adivinhar rapidamente se um número é possível número de telefone usando apenas a informação de comprimento, muito mais rápido do que uma validação completa.
  • isValidNumber - validação completa de um número de telefone para uma região com informação de comprimento e prefixo.
  • AsYouTypeFormatter - Formata números de telefone em tempo real quando os utilizadores entram em cada dígito.
  • findNumbers - encontra números na entrada de texto.
  • PhoneNumberOfflineGeocoder - fornece informações geográficas relacionadas com um número de telefone.

Exemplos

O maior problema com o número de telefone a validação é muito culturalmente dependente.
  • América
    • (408) 974–2042 é um válido número dos EUA
    • (999) 974–2042 is not a valid US number
  • Austrália
    • 0404 999 999 é um válido Número Australiano
    • (02) 9999 9999 também é um válido Número Australiano
    • (09) 9999 9999 is not a valid Australian number

Uma expressão regular é bom para verificar o formato de um número de telefone, mas ele realmente não vai ser capaz de verificar a validade de um número de telefone.

Sugiro saltar uma simples expressão regular para testar o seu número de telefone e usar uma biblioteca como a do Google.libphonenumber ( link to GitHub project) . Apresento-vos a libphonenumber!

Usando um dos seus exemplos mais complexos, 1-234-567-8901 x1234, obtém os seguintes dados de libphonenumber (link online demonstração):

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

Por isso, não só você aprende se o número de telefone é válido (o que é), como também obtém uma formatação consistente do número de telefone no seu local.

Como um bônus, libphonenumber tem um número de conjuntos de dados para verificar a validade dos números de telefone, bem como, para a verificação de um número como +61299999999 (a versão internacional do (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
A Libphonenumber também lhe dá muitos benefícios adicionais, como agarrar a localização que o número de telefone é detectado como sendo, e também obter a informação do fuso horário a partir do 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) devolve 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 tem código para Java e Javascript, mas as pessoas também implementaram bibliotecas para outras linguagens que usam o conjunto de dados de números de telefone do Google i18n:

A menos que tenhas a certeza de que vais estar sempre a aceitar números de um local, e eles vão estar sempre num formato, sugiro fortemente que Não escrevas o teu próprio código para isto, e que uses o libphonenumber para validar e mostrar números de telefone.

 137
Author: timgws, 2018-02-08 15:38:30

/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i

Isto corresponde:

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973
Por $ n, poupa-se:
  1. indicador do País
  2. Número de Telefone
  3. extensão

Podes testá-lo em https://www.regexpal.com/?fam=99127

 68
Author: Ismael Miguel, 2017-09-22 10:05:59
Embora a resposta para remover todos os espaços em branco seja simples, não resolve o problema que se coloca, que é encontrar um vértice. Veja, por exemplo, o meu script de teste que descarrega uma página web e extrai todos os números de telefone usando a regex. Uma vez que precisarias de um regex de qualquer maneira, mais vale pedires ao regex para fazer o trabalho todo. Eu inventei isto:
1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?
Aqui está um script perl para testá-lo. Quando você combinar, $1 contém o código da Área, $2 e $3 contêm o número de telefone, e $5 contém a extensão. O meu script de teste descarrega um ficheiro da internet e imprime todos os números de telefone nele.
#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"1-234-567-8901",
"1-234-567-8901 x1234",
"1-234-567-8901 ext1234",
"1 (234) 567-8901",
"1.234.567.8901",
"1/234/567/8901",
"12345678901",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

Editar:

Pode mudar \W* para \s*\W?no regex para apertar um pouco. Eu não estava pensando no regex em termos de, digamos, validar a entrada do usuário em um formulário quando eu o escrevi, mas esta mudança torna possível usar o regex para esse propósito.
'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';
 62
Author: indiv, 2008-09-23 22:24:04
[[21]} eu respondi a esta pergunta sobre outra questão SO antes de decidir incluir também a minha resposta como uma resposta sobre este tópico, porque ninguém estava a abordar como exigir / não exigir itens, apenas a distribuir regexs: a expressão regular funciona mal, combinando coisas inesperadas A partir do meu post naquele site, criei um guia rápido para ajudar qualquer um a fazer o seu próprio regex para o seu próprio formato de número de telefone desejado, o que eu vou ressaltar (como fiz no outro site) que se você é muito restritivo, você pode não obter os resultados desejados, e não há nenhuma solução "Tamanho Único se encaixa a todos" para aceitar todos os números de telefone possíveis no mundo - apenas o que você decide aceitar como seu formato de escolha. Use por sua conta e risco. Cábula rápida
  • iniciar a expressão: /^
  • se quiser necessitar de espaço, use: [\s] ou \s
  • se quiser necessitar de parêntesis, use: [(] e [)]. Usar \( e \) é feio e pode tornar as coisas confusas.
  • se quiser que algo seja opcional, coloque um ? depois dele
  • se quiser um hífen, escreva - ou [-]. Se você não colocar primeiro ou último em uma série de outros personagens, no entanto, você pode precisar escapar: \-
  • se quiser aceitar escolhas diferentes num espaço, coloque parêntesis à volta das opções: [-.\s] irá necessitar de um hífen, período ou espaço. Um ponto de interrogação após o último intervalo tornará facultativas todas as opções para esse efeito. ranhura.
  • \d{3} requer um número de 3 dígitos: 000-999. Estenografia para [0-9][0-9][0-9].
  • [2-9] é necessário um dígito 2-9 para esse slot.
  • (\+|1\s)?: aceitar um " mais "ou um 1 e um espaço (caracter de tubo, |, é" ou"), e torná-lo opcional. O sinal de" mais " deve ter escapado.
  • se quiser que os números específicos correspondam a um 'slot', indique-os: [246] irá necessitar de um 2, 4 ou 6. [77|78] será necessário 77 ou 78.
  • $/: terminar a expressão
 39
Author: vapcguy, 2017-05-23 12:18:32

Eu escrevi simpliest (embora eu não precisasse de ponto nele).

^([0-9\(\)\/\+ \-]*)$

Tal como mencionado abaixo, verifica apenas os caracteres, não a sua estrutura/ordem

 27
Author: Artjom Kurapov, 2015-07-29 22:53:45

Note que a remoção de caracteres {[[0]} não funciona para um estilo de escrita de números do Reino Unido que é comum: +44 (0) 1234 567890 o que significa marcar ou o número internacional:
+441234567890
ou no mostrador do Reino Unido01234567890

 22
Author: Ben Clifford, 2015-08-03 04:38:07

Se você só quer verificar que você não tem lixo aleatório no campo (isto é, a partir de spammers forma) este regex deve fazer muito bem:

^[0-9+\(\)#\.\s\/ext-]+$

Note que ele não tem nenhuma regra especial para quantos dígitos, ou quais números são válidos nesses dígitos, ele apenas verifica que apenas dígitos, parêntesis, traços, mais, espaço, Libra, asterisco, período, vírgula, ou as letras e, x, t estão presentes.

Deve ser compatível com números internacionais e localização formato. Você prevê alguma necessidade de permitir suportes quadrados, encaracolados ou angulados para algumas regiões? (atualmente eles não estão incluídos).

Se você quiser manter as regras por dígito (como nos códigos de área e prefixos (códigos de troca) dos EUA deve cair na faixa de 200-999) bem, boa sorte para você. A manutenção de um conjunto complexo de regras que poderia estar desactualizado em qualquer momento do futuro por qualquer país do mundo não parece divertido.

E enquanto se tira todos / a maioria dos caracteres não numéricos pode funcionar bem no lado do servidor (especialmente se você está planejando passar esses valores para um dialer), você pode não querer alterar a entrada do usuário durante a validação, particularmente se você quiser que eles façam correções em outro campo.

 18
Author: Steve, 2012-10-18 19:33:53
Já viste a RegExLib? A entrada no nosso número de telefone trouxe-nos uma lista de possibilidades.
 14
Author: Rob Wells, 2008-09-23 20:19:52
Achei que isto funcionava muito bem.
^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

Funciona para estes formatos de números:

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050

Certifique-se de usar bandeiras globais e multi-linhas para se certificar.

Ligação: http://www.regexr.com/3bp4b

 12
Author: Herobrine2Nether, 2015-09-11 22:02:49

Se está a falar de validação do formulário, a expressão regular para validar o significado correcto, bem como os dados correctos, vai ser extremamente complexa devido às diferentes normas de país e fornecedor. Também será difícil manter-se actualizado.

Eu interpreto a pergunta como Procurando um padrão amplamente válido, que pode não ser internamente consistente - por exemplo, ter um conjunto válido de números, mas não validando que a linha de tronco, troca, etc. ao padrão válido para o país prefixo de código.

A América do Norte é simples, e para a internacional prefiro usar um padrão 'idiomático' que cobre as formas como as pessoas especificam e lembram os seus números:

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

O padrão norte-americano garante que se um parêntesis for incluído ambos são. As contas internacionais para um inicial opcional " + " e o código do país. Depois disso, estás no idioma. As correspondências válidas seriam be:

  • (xxx)xxx-xxxx
  • (xxx)-xxx-xxxx
  • (xxx)xxx-xxxx x123
  • 12 1234 123 1 x1111
  • 12 12 12 12 12
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678
Isto pode ser tendencioso, pois a minha experiência limita-se à América do Norte, à Europa e a um pouco da Ásia.
 11
Author: ron0, 2012-10-18 19:36:58

A minha tentativa de um regex sem restrições:

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/

Aceita:

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww

Rejeitados:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

Cabe-lhe a si higienizá-lo para exibição. Depois de validar Pode ser um número.

 11
Author: ReactiveRaven, 2015-04-30 15:29:43

Este é um padrão de expressão Regular simples para os números de telemóvel das Filipinas:

((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

Ou

((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

Irá igualar estes:

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  
O primeiro corresponde a qualquer código de país de dois dígitos, enquanto o segundo corresponde exclusivamente ao código de país das Filipinas.

Testa aqui: http://refiddle.com/1ox

 10
Author: GaiusSensei, 2012-10-18 19:35:59
A minha intuição é reforçada pela quantidade de respostas a este tópico - que há um número virtualmente infinito de soluções para este problema, nenhuma das quais vai ser elegante. Sinceramente, recomendo que não tente validar números de telefone. Mesmo que você pudesse escrever um grande, Peludo validador que permitiria todos os diferentes formatos legítimos, ele acabaria permitindo praticamente qualquer coisa remotamente parecido com um número de telefone em primeiro lugar.

Na minha opinião, a solução mais elegante é validar um comprimento mínimo, nada mais.

 9
Author: mindplay.dk, 2011-04-14 20:56:45

Você vai ter dificuldade em lidar com números internacionais com um único / simples regex, veja este post sobre as dificuldades dos números de telefone internacionais (e mesmo norte-americanos).

Você vai querer analisar os primeiros dígitos para determinar qual é o código do país, em seguida, agir de forma diferente com base no país.

Além disso - a lista que deu não inclui outro formato comum nos EUA-deixando de fora o 1 inicial. A maioria dos telemóveis nos EUA não o exigem., e vai começar a desconcentrar a geração mais jovem, a não ser que tenham ligado internacionalmente.

Identificaste correctamente que é um problema complicado...

-Adam

 8
Author: Adam Davis, 2017-05-23 11:47:36

Depois de ler estas respostas, parece que não houve uma expressão regular simples que possa processar através de um monte de texto e obter números de telefone em qualquer formato (incluindo internacional com e sem o sinal de mais).

Aqui está o que eu usei para um projeto cliente recentemente, onde tivemos que converter todos os números de telefone em qualquer formato para Tel: links.

Até agora, tem funcionado com tudo o que lhe atiraram, mas se surgirem erros, vou actualizar isto. resposta.

Regex:

/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/

Função PHP para substituir todos os números de telefone por tel: links (no caso de alguém estar curioso):

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}
 8
Author: Drew Thomas, 2014-07-08 18:28:53
Aqui está um padrão maravilhoso que mais correspondia à validação que eu precisava alcançar. Eu não sou o autor original, mas eu acho que vale a pena compartilhar como eu achei este problema para ser muito complexo e sem uma resposta concisa ou amplamente útil.

A seguinte expressão regular captará combinações de Números e caracteres amplamente utilizadas numa variedade de formatos globais de números de telefone:

/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm

Positivo:
+42 555.123.4567
+1-(800)-123-4567
+7 555 1234567
+7(926)1234567
(926) 1234567
+79261234567
926 1234567
9261234567
1234567
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 416 555 9292

Negativo:
926 3 4
8 800 600-maçã

Fonte Original: http://www.regexr.com/38pvb

 8
Author: Stuart Kershaw, 2015-04-23 22:24:05
Eis a minha melhor tentativa até agora. Ele lida com os formatos acima, mas tenho certeza que estou faltando alguns outros formatos possíveis.
^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
 7
Author: Nicholas Trandem, 2008-09-23 20:14:20

Eu acredito no número : Telefone:: US e Regexp::Common (particularmente a fonte de Regexp::Common::URI: RFC2806) Perl modules could help.

A questão provavelmente deve ser especificada com um pouco mais de detalhe para explicar o propósito de validar os números. Por exemplo, 911 é um número válido nos EUA, mas 911x não é para qualquer valor de X. Isso é de modo que a companhia de telefone pode calcular quando você está feito de marcação. Existem várias variações sobre este problema. Mas a tua regex não verifica a parte do Código da área, por isso, isso não parece ser uma preocupação.

Como Validar endereços de E-mail, mesmo que tenha um resultado válido, Não pode saber se é atribuído a alguém até o experimentar.

Se está a tentar validar a entrada do utilizador, porque não normalizar o resultado e acabar com ele? Se o usuário colocar em um número que você não pode reconhecer como um número válido, tanto salvá-lo como intrutted ou strip para fora de caracteres indisponíveis. O número:: telefone:: Normalize O módulo Perl pode ser uma fonte de inspiração.

 6
Author: Jon Ericson, 2008-09-23 21:02:04
Trabalho para uma empresa de pesquisa de mercado e temos de filtrar estes tipos de input o tempo todo. Estás a complicar demasiado. Tira os caracteres não alfanuméricos e vê se há uma extensão.

Para uma análise mais aprofundada, pode subscrever um dos muitos fornecedores que lhe dará acesso a uma base de dados de números válidos, bem como dizer-lhe se são telefones fixos ou móveis, desligados, etc. Custa dinheiro.

 4
Author: Joe Phillips, 2008-09-23 20:41:56

Faça uma substituição em caracteres de formatação e verifique a validade do telemóvel restante. Em PHP,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );
Quebrar uma expressão complexa como esta pode ser igualmente eficaz, mas muito mais simples.
 4
Author: rooskie, 2009-07-21 12:03:56
Achei isto interessante. Não o testei, mas parece que funcionaria.
<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>
 3
Author: Chris, 2011-03-01 13:37:04

Provavelmente estarias melhor se usasses uma entrada mascarada para isto. Dessa forma, os usuários só podem inserir números e você pode formatar como quiser. Eu não tenho certeza se isso é para uma aplicação web, mas se é que há um plugin jQuery muito Clique que oferece algumas opções para fazer isso.

Http://digitalbush.com/projects/masked-input-plugin/

Até analisam como mascarar as entradas dos números de telefone no tutorial.
 3
Author: Abe Miessler, 2011-08-11 05:10:29
Aqui está um que funciona bem em JavaScript. Está em uma corda porque é o que o widget Dojo estava esperando. Corresponde a um número Nano da América do Norte de 10 dígitos com uma extensão opcional. Espaços, traços e períodos são delimitadores aceitos.
"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"
 3
Author: Richard Ayotte, 2012-05-13 19:47:55
Estava a debater-me com o mesmo problema, a tentar fazer a minha candidatura à prova do futuro, mas estes tipos fizeram-me ir na direcção certa. Eu não estou realmente verificando o número em si para ver se ele funciona ou não, eu estou apenas tentando garantir que uma série de números foram inseridos que pode ou não ter uma extensão.

Na pior das hipóteses, se o utilizador tivesse de retirar um número não formatado do ficheiro XML, continuariam a digitar os números no número do telemóvel 012345678x5, Sem real razão para manter as coisas bonitas. Esse tipo de "RegEx" sairia algo assim para mim.

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890
 3
Author: 3 revs, 3 users 43%Keith Wiggans, 2012-10-18 19:38:01
A minha inclinação é concordar que despir Não-dígitos e aceitar o que há de melhor. Talvez para garantir que pelo menos alguns dígitos estão presentes, embora isso proíba algo como um número de telefone alfabético "ASK-JAKE", por exemplo.

Algumas expressões simples de perl podem ser:

@f = /(\d+)/g;
tr/0-9//dc;

Use o primeiro para manter os grupos de dígitos juntos, o que pode dar pistas de formatação. Use o segundo para atirar trivialmente todos os não-dígitos.

É uma preocupação que poderá ser necessário fazer uma pausa e depois introduzir mais teclas? Ou algo como 555-1212 (espere pelo sinal) 123?
 2
Author: piCookie, 2008-09-23 22:59:20
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

Deve terminar com um dígito, pode começar com ( ou + ou um dígito, e pode conter + - (ou)

 2
Author: Ian, 2011-02-28 23:16:18
Para quem estiver interessado em fazer algo semelhante com os números de telemóvel Irlandeses, eis uma forma simples de o conseguir:

Http://ilovenicii.com/?p=87

PHP


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";
Há também uma solução JQuery nesse link.

Editar:

Solução JQuery:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

Fonte

 2
Author: Lajos Arpad, 2015-04-30 15:38:51