Pergunta

Eu estou tentando montar um regex abrangente para números de telefone validado. Idealmente seria lidar com formatos internacionais, mas deve lidar com formatos dos EUA, incluindo o seguinte:

  • 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

Eu vou responder com a minha tentativa atual, mas eu estou esperando que alguém tem algo melhor e / ou mais elegante.

Foi útil?

Solução

Melhor opção ... só tira todos os caracteres não-dígito na entrada (exceto 'x' e líder '+' sinais), tendo o cuidado devido à tendência britânico para números gravação na +44 (0) ... forma não-padrão quando solicitado a usar o prefixo internacional (nesse caso específico, você deve descartar o (0) inteiramente).

Então, você acaba com valores como:

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

Então, quando você exibir, reformatar os vossos corações conteúdo. por exemplo.

  1 (234) 567-8901
  1 (234) 567-8901 x1234

Outras dicas

Acontece que há algo de uma especificação para isso, pelo menos para a América do Norte, o chamado NANP .

Você precisa especificar exatamente o que você quer. Quais são delimitadores legais? Espaços, traços e períodos? Sem delimitador permitido? pode-se misturar delimitadores (por exemplo, + ,111-222,3333)? Como são extensões (por exemplo, 111-222-3333 x 44444) vai ser tratado? E sobre números especiais, como 911? É o código de área vai ser opcional ou necessário?

Aqui está um regex para um número 7 ou 10 dígitos, com extensões permitidas, 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+))?$
.*

Se o usuário quer dar-lhe seu número de telefone, então confiar nele para obtê-lo direito. Se ele não quer dar a você, em seguida, forçando-o a introduzir um número válido vão quer mandá-lo para um site concorrente ou fazê-lo entrar em uma seqüência aleatória que se adequa ao seu regex. Eu poderia até ser tentados a olhar para cima o número de uma linha de sexo taxa de prémio e entrar naquele lugar.

Eu também consideraria qualquer um dos seguintes como entradas válidas em um web 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"

Também gostaria de sugerir a olhar para o " libphonenumber " Google Library. Eu sei que não é regex, mas ele faz exatamente o que você quer.

Por exemplo, ele irá reconhecer que:

15555555555

é um número possível, mas não é um número válido. Ele também suporta países fora os EUA.

Destaques de funcionalidade:

  • Análise / formatação / validar números de telefone para todos os países / regiões do mundo.
  • getNumberType - obtém o tipo do número baseado no número propriamente dito; capaz de distinguir de telefonia fixa, móvel, Toll-free, prémio de taxa, custos repartidos, VoIP e pessoais Números (sempre que possível).
  • isNumberMatch -. Obtém um nível de confiança sobre se dois números poderia ser o mesmo
  • getExampleNumber / getExampleNumberByType -. Fornece números de exemplo válidas para todos os países / regiões, com a opção de especificar que é necessário tipo de número de telefone exemplo
  • isPossibleNumber -. Rapidamente adivinhar se um número é um possível phonenumber 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 usando o comprimento e informações de prefixo
  • AsYouTypeFormatter -. Números formatos de telefone on-the-fly quando os usuários entram cada dígito
  • findNumbers -. Números encontra na entrada de texto
  • PhoneNumberOfflineGeocoder - fornece informações geográficas relacionadas com um número de telefone.

Exemplos

O maior problema com a validação de número de telefone é que é muito culturalmente dependentes.

  • América
    • (408) 974–2042 é um válido número de US
    • (999) 974–2042 é não um válido número de US
  • Austrália
    • 0404 999 999 é um válido número Australian
    • (02) 9999 9999 também é um válido número Australian
    • (09) 9999 9999 é não um válido número Australian

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

gostaria de sugerir faça uma expressão regular para testar o seu número de telefone contra, e usando uma biblioteca como o Google do libphonenumber ( link para projeto GitHub) .

Apresentando libphonenumber!

Usando um de seus exemplos mais complexos, 1-234-567-8901 x1234, você começa os seguintes dados fora do libphonenumber (link para 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

Assim, não só você saber se o número de telefone é válido (o que é), mas você também terá número de telefone consistente formatação em sua localidade.

Como um bônus, libphonenumber tem uma série 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 a 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

libphonenumber também lhe dá muitos benefícios adicionais, como agarrando o local que o número de telefone é detectado como sendo, e também obter as informações de 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 australiana inválido ( (09) 9999 9999 )retornos que não é um número de telefone válido.

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

A versão de Google tem código para Java e Javascript, mas as pessoas também têm implementado bibliotecas para outras línguas que usam o conjunto de dados de número de telefone i18n Google:

A menos que você esteja certo de que você está sempre vai ser aceitar os números de um local, e eles estão sempre vai estar em um formato, eu gostaria fortemente sugerir não escrever seu próprio código para isso, e usando libphonenumber para validar e exibindo números de telefone.

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

Este partidas:

 - (+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

Em $ n, ele economiza:

  1. indicador País
  2. Número de telefone
  3. extensão

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

Embora a resposta para tirar todos os espaços é puro, ele realmente não resolver o problema que está colocado, que é encontrar um regex. Tomemos, por exemplo, o meu script de teste que os downloads de uma página web e extrai todos os números de telefone usando o regex. Desde que você precisa de um regex de qualquer maneira, assim como você pode ter a regex fazer todo o trabalho. Eu vim com isso:

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, US $ 1 contém o código de área, US $ 2 e US $ 3 contêm o número de telefone, e US $ 5 contém a extensão. Meu teste de downloads de script de um arquivo da internet e imprime todos os números de telefone nela.

#!/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:

Você pode mudar \ W * a \ s * \ W? \ S * no regex para apertá-lo um pouco. Eu não estava pensando no regex em termos de, digamos, validando a entrada do usuário em um formulário quando escrevi isso, mas esta mudança faz com que seja possível usar o regex para o efeito.

'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*))?';

Eu respondi a essa pergunta sobre outra questão SO antes de decidir para incluir também a minha resposta como uma resposta sobre esta discussão, porque ninguém estava se dirigindo como exigir / não exigem itens, apenas distribuindo regexs: Regex errado trabalho, combinando coisas inesperadas

Do meu post sobre o site, eu criei um guia rápido para ajudar alguém com fazer seu próprio regex para seu próprio formato de número de telefone desejado, que vou ressalva (como eu fiz no outro site) que se você estiver demasiado restritiva, você pode não obter os resultados desejados, e não há "one size fits all" solução para aceitar todos os números de telefone possíveis no mundo - somente o que você decidir aceitar como seu formato de escolha. Use a seu próprio risco.

folha de fraude rápida

  • Inicie a expressão: /^
  • Se você quiser exigir um espaço, use: [\s] ou \s
  • Se você quiser exigir parêntese, use: [(] e [)]. Usando \( e \) é feio e pode tornar as coisas confusas.
  • Se você quer alguma coisa a ser opcional, coloque um ? depois
  • Se você quer um hífen, basta digitar - ou [-]. Se você não colocá-lo primeiro ou o último em uma série de outros personagens, no entanto, pode ser necessário fugir dela: \-
  • Se você quiser aceitar as escolhas diferentes em um slot, coloque entre parênteses em torno das opções: [-.\s] exigirá um hífen, ponto ou espaço. Um ponto de interrogação após o último suporte fará com que todos aqueles opcional para esse slot.
  • \d{3}: requer um número de 3 dígitos: 000-999. abreviada para [0-9][0-9][0-9].
  • [2-9]:. Requer um dígito 2-9 para esse slot
  • (\+|1\s)?: Aceitar um "plus" ou um 1 e um espaço (caractere pipe, |, é "ou"), e torná-la opcional. O "plus" sinal deve ser escapado.
  • Se você quiser números específicos para coincidir com um slot, entre eles: [246] exigirá a 2, 4 ou 6. [77|78] vai exigir 77 ou 78
  • .
  • $/: Termine a expressão

Eu escrevi simpliest (embora eu não precisava ponto no mesmo).

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

Como mencionado abaixo, ele verifica apenas para caracteres, não a sua estrutura / fim

Note que descascar personagens () não funciona para um estilo de escrever números do Reino Unido que é comum: +44 (0) 1234 567890 que significa discar qualquer número internacional:
+441234567890
ou na 01234567890 marcação Reino Unido

Se você quiser apenas para verificar que você não tem lixo aleatório no campo (ou seja, a partir de spammers formulário) este regex deve fazer muito bem:

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

Note que ele não tem quaisquer regras especiais para quantos dígitos, ou o que os números são válidos em esses dígitos, ele apenas verifica que somente dígitos, parênteses, traços, além de, espaço, libra, asterisco, ponto, vírgula ou as letras e, x, t estão presentes.

Deve ser compatível com números internacionais e formatos de localização. Você prevê qualquer necessidade de permitir suportes quadrado, encaracolado, ou dobrados para algumas regiões? (Atualmente eles não estão incluídos).

Se você quer manter por regras dígitos (como na Area Codes EUA e prefixos (códigos de câmbio) deve cair na faixa de 200-999) bem, boa sorte para você. A manutenção de um conjunto de regras complexas que poderia ser ultrapassada a qualquer momento no futuro por qualquer país no mundo não faz divertido som.

E enquanto tirando todos a maioria dos personagens / não numéricos podem funcionar bem no lado do servidor (especialmente se você está pensando em passar esses valores para um discador), você não pode querer thrash entrada do usuário durante a validação, especialmente se você quer que eles para fazer as correções em outro campo.

Você já teve um olhar sobre a RegExLib ?

introduzindo o número de telefone dos EUA trouxe de volta uma grande lista de possibilidades.

A minha tentativa de regex unrestrictive:

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

Aceita:

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

Rejects:

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

É até você para higienizar-lo para exibição. Depois de validar ele pode ser um número embora.

Encontrei este trabalho muito bem:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

Ele funciona para estes formatos de número:

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 várias linhas para ter certeza.

Link: http://www.regexr.com/3bp4b

Se você está falando sobre a validação de formulário, o regexp para validar significado correto, bem como dados corretos vai ser extremamente complexa por causa de normas nacionais e provedor de variação. Também será difícil manter-se atualizado.

Eu interpreto a questão de procurar um padrão globalmente válido, que pode não ser internamente consistente - por exemplo, ter um conjunto válido de números, mas não validar que a linha tronco, câmbio, etc., para o padrão válido para o indicativo de país.

América do Norte é simples, e por internacional eu prefiro usar um padrão 'idiomático' que cobre as maneiras pelas quais as pessoas especificam e lembrar 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êntese está incluído ambos são. As contas internacionais para um '+' inicial opcional e código do país. Depois disso, você está no idioma. partidas válidas seria:

  • (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

Esta pode ser tendenciosa como a minha experiência é limitada a América do Norte, Europa e um pequeno pedaço de Ásia.

Minha intuição é reforçado pela quantidade de respostas a este tópico -. Que há um número virtualmente infinito de soluções para este problema, nenhum dos quais vão ser elegante

Honestamente, eu recomendo que você não tente para validar números de telefone. Mesmo se você pudesse escrever um grande, peludo validador que permitiria que todos os formatos diferentes legítimos, ele acabaria permitindo que praticamente qualquer coisa, mesmo 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.

Este é um padrão de expressão regular simples para Philippine Telefones móveis:

((\+[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á corresponder a estes:

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  

O primeiro irá corresponder a qualquer código de país de dois dígitos, enquanto o segundo irá coincidir com o código do país Philippine exclusivamente.

Test-lo aqui: http://refiddle.com/1ox

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

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

Além disso - a lista que você deu não inclui outro formato comum US - deixando de fora as 1. A maioria dos telefones celulares iniciais nos EUA não exigem-lo, e ele vai começar a confundir a geração mais jovem, a menos que eles têm marcado internacionalmente.

Você identificou corretamente que é um problema complicado ...

-Adam

Aqui está um padrão maravilhoso que mais estreitamente alinhados a validação de que eu precisava para conseguir. Eu não sou o autor original, mas acho que vale a pena compartilhar como eu encontrei este problema a ser muito complexo e sem uma concisa ou resposta amplamente útil.

A seguir regex vai pegar números e caracteres combinações amplamente utilizado em uma variedade de formatos de número de telefone global:

/^\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

Aqui está a minha melhor tentativa até agora. Ele lida com os formatos acima, mas eu 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}))?$

Depois de ler estas respostas, parece que não houve uma expressão regular simples que pode analisar através de um monte de texto e retirar 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:. Ligações

Até agora, ele tem trabalhado com tudo o que tenho jogado nele, mas se erros surgem, eu vou atualizar esta resposta.

Regex:

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

função PHP para substituir todos os números de telefone com tel: links (no caso de alguém é 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;
}

Eu acredito que a Número :: Telefone :: US e Regexp :: comum (especialmente a fonte de Regexp :: comum :: URI :: RFC2806 ) módulos Perl poderia ajudar.

A questão provavelmente deve ser especificada em um pouco mais detalhadamente 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 é para que a empresa de telefonia pode calcular quando terminar a marcação. Existem diversas variações sobre o tema. Mas seu regex não verifica a parte de código de área, de modo que não parece ser uma preocupação.

Como validar endereços de email, mesmo se você tiver um resultado válido não é possível saber se ele é atribuído a alguém até que você experimentá-lo.

Se você está tentando validar entrada do usuário, por que não normalize o resultado e ser feito com ele? Se as puts usuário em um número que não pode reconhecer como um número válido, ou guardá-lo como digitada ou retirar personagens undailable. A Número :: Telefone :: Normalize módulo Perl pode ser uma fonte de inspiração.

Eu trabalho para uma empresa de pesquisa de mercado e nós temos que filtrar esses tipos de entrada alllll o tempo. Você está complicando muito. Apenas tira os caracteres não alfanuméricos, e ver se há uma extensão.

Para uma análise mais aprofundada você pode se inscrever para um dos muitos fornecedores que lhe dará acesso a um banco de dados de números válidos, bem como dizer se eles são fixos ou celulares, desconectado, etc. Custa dinheiro.

Do uma substituição em caracteres de formatação, em seguida, verifique o restante para validade telefone. 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 );

Quebrando um regexp complexo como este pode ser tão eficaz, mas muito mais simples.

Eu encontrei este para ser algo interessante. Eu não testei, mas parece que ele iria trabalhar

<?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.';
}
?>

Você provavelmente seria melhor usar um Input Mascarado para isso. Que os usuários única maneira possível digitar números e você pode formatar, contudo, você vê o ajuste. Eu não tenho certeza se isto é para uma aplicação web, mas se ele está lá é muito clique jQuery plugin que oferece algumas opções para fazer isso.

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

Eles ainda passar por cima como para mascarar inputs telefone em seu tutorial.

Aqui está um que funciona bem em JavaScript. É em uma string porque é isso que o Dojo Widget estava esperando.

Ele corresponde a 10 dígitos número América do Norte NANP com extensão opcional. Espaços, traços e períodos são delimitadores aceitou.

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

Eu estava lutando com o mesmo problema, tentando fazer o meu futuro aplicação à prova, mas esses caras me pegou indo na direção certa. Eu não estou realmente verificar o número em si para ver se ele funciona ou não, eu só estou tentando ter certeza de que uma série de números foi inserido que podem ou não podem ter uma extensão.

Na pior das hipóteses, se o usuário tinha que puxar um número não formatado a partir do arquivo XML, eles ainda basta digitar os números em 012345678x5 numérico do telefone, nenhuma razão real para mantê-la bonita. Esse tipo de RegEx sairia algo assim para mim:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

Minha inclinação é concordar que decapagem não-dígitos e apenas aceitar o que está lá é o melhor. Talvez para garantir pelo menos um par de dígitos estão presentes, apesar de que proíbe algo como um número de telefone alfabética "ASK-JAKE", por exemplo.

Um simples par perl expressões podem ser:

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

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

É uma preocupação que pode haver necessidade de haver uma pausa e, em seguida, mais chaves entrou? Ou algo parecido 555-1212 (Aguarde o bipe) 123?

    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)

Para qualquer um interessado em fazer algo semelhante com números irlandeses de telefonia móvel, aqui está uma maneira simples de realizá-la:

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 sobre essa ligação.

EDIT:

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top