Um regex abrangente para validação de números de telefone

Estou tentando montar um regex abrangente para validar números de telefone. Idealmente, ele iria 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

Vou responder com a minha tentativa atual, mas espero que alguém tenha algo melhor e / ou mais elegante.

Melhor opção … apenas tira todos os caracteres não dígitos na input (exceto ‘x’ e levando os sinais ‘+’), tomando cuidado por causa da tendência britânica de escrever números no formato não-padrão +44 (0) ... 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, reformate o conteúdo do seu coração. por exemplo

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

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

Você precisa especificar exatamente o que você quer. O que são delimitadores legais? Espaços, traços e períodos? Nenhum delimitador é permitido? Pode-se misturar delimitadores (por exemplo, + 0.111-222.3333)? Como as extensões (por exemplo, 111-222-3333 x 44444) serão tratadas? E quanto aos números especiais, como o 911? O código de área será opcional ou obrigatório?

Aqui está um regex para um número de 7 ou 10 dígitos, com extensões permitidas, delimitadores são espaços, traços ou pontos:

 ^(?:(?:\+?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 quiser fornecer seu número de telefone, confie nele para acertar. Se ele não quer dar a você, então forçá-lo a digitar um número válido, vai mandá-lo para o site de um concorrente ou fazê-lo digitar uma string aleatória que se encheckbox no seu regex. Eu poderia até ser tentado a procurar o número de uma linha de sexo com taxa premium e entrar em seu lugar.

Eu também considero qualquer um dos seguintes itens como inputs válidas em um 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" 

Eu também sugeriria olhar para o ” libphonenumber ” Google Library. Eu sei que não é regex, mas faz exatamente o que você quer.

Por exemplo, ele reconhecerá que:

 15555555555 

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

Destaques da funcionalidade:

  • Analisando / formatando / validando números de telefone para todos os países / regiões do mundo.
  • getNumberType – obtém o tipo do número baseado no próprio número; capaz de distinguir linha fixa, móvel, chamada gratuita, taxa premium, custo compartilhado, VoIP e números pessoais (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 o tipo de número de telefone de exemplo necessário.
  • isPossibleNumber – adivinhando rapidamente se um número é um possível número de telefone 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 números de telefone em tempo real quando os usuários inserem cada dígito.
  • findNumbers – localiza números na input de texto.
  • PhoneNumberOfflineGeocoder – fornece informações geográficas relacionadas a um número de telefone.

Exemplos

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

  • América
    • (408) 974–2042 é um número válido nos EUA
    • (999) 974–2042 não é um número válido nos 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 é boa para verificar o formato de um número de telefone, mas na verdade não será capaz de verificar a validade de um número de telefone.

Eu sugeriria ignorar uma expressão regular simples para testar seu número de telefone e usar uma biblioteca como o libphonenumber da libphonenumber do Google (link para o projeto GitHub) .

Apresentando libphonenumber!

Usando um dos seus exemplos mais complexos, 1-234-567-8901 x1234 , você obtém os seguintes dados de 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, você não apenas aprende se o número de telefone é válido (o que é), mas também obtém formatação consistente de números de telefone em sua localidade.

Como bônus, o libphonenumber tem vários conjuntos de dados para verificar a validade dos números de telefone, portanto, 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 capturar o local em que o número de telefone é detectado 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 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 tem código para Java e Javascript, mas as pessoas também implementaram bibliotecas para outros idiomas que usam o dataset de números de telefone do Google i18n:

A menos que você tenha certeza de que sempre aceitará números de uma localidade, e eles sempre estarão em um formato, sugiro fortemente que você não escreva seu próprio código para isso e use libphonenumber para validar e exibir números de telefone.

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

Isso 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 

Em $ n, salva:

  1. Indicador do 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 retirar todo o espaço em branco seja boa, isso não resolve realmente o problema que é colocado, que é encontrar um regex. Tomemos, por exemplo, meu script de teste que baixa uma página da web e extrai todos os números de telefone usando o regex. Desde que você precisa de um regex de qualquer maneira, você pode também ter o regex fazer todo o trabalho. Eu inventei 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ê combina, $ 1 contém o código de área, $ 2 e $ 3 contêm o número de telefone e $ 5 contém a extensão. Meu script de teste faz o download de um arquivo 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:

Você pode alterar \ W * para \ s * \ W \ s * no regex para aumentar um pouco. Eu não estava pensando na regex em termos de, por exemplo, validar a input do usuário em um formulário quando eu o escrevi, mas essa alteração torna possível usar o regex para essa finalidade.

 '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 esta pergunta em outra pergunta da SO antes de decidir include também a minha resposta como uma resposta nesta discussão, porque ninguém estava abordando como exigir / não requerer itens, apenas distribuindo regexs: Regex funcionando errado, combinando coisas inesperadas

Do meu post naquele site, eu criei um guia rápido para ajudar qualquer um a fazer seu próprio regex para o formato de número de telefone desejado, o qual eu vou advertir (como eu fiz no outro site) que se você é muito restritivo, você pode não obter os resultados desejados, e não há uma solução “tamanho único” para aceitar todos os números de telefone possíveis no mundo – apenas o que você decide aceitar como o formato de sua escolha. Use por sua conta e risco.

Folha de cola rápida

  • Comece a expressão: /^
  • Se você quiser exigir um espaço, use: [\s] ou \s
  • Se você quiser exigir parênteses, use: [(] e [)] . Usar \( e \) é feio e pode tornar as coisas confusas.
  • Se você quiser que qualquer coisa seja opcional, coloque um ? depois disso
  • Se você quiser um hífen, apenas digite - ou [-] . Se você não colocar primeiro ou por último em uma série de outros caracteres, talvez seja necessário escaping dele: \-
  • Se você quiser aceitar diferentes opções em um slot, coloque colchetes ao redor das opções: [-.\s] exigirá um hífen, ponto final ou espaço. Um ponto de interrogação após o último colchete fará todos os opcionais para esse slot.
  • \d{3} : Requer um número de 3 dígitos: 000-999. Abreviação para [0-9][0-9][0-9] .
  • [2-9] : Requer um dígito de 2 a 9 para esse slot.
  • (\+|1\s)? : Aceite um “mais” ou um 1 e um espaço (caractere de canal, | , é “ou”) e torne-o opcional. O sinal “mais” deve ser escapado.
  • Se você quiser que números específicos correspondam a um slot, insira-os: [246] exigirá um 2, 4 ou 6. [77|78] exigirá 77 ou 78.
  • $/ : Termina a expressão

Eu escrevi mais simples (embora eu não precise de ponto nele).

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

Como mencionado abaixo, ele verifica apenas caracteres, não sua estrutura / ordem

Observe que os caracteres de decapagem () não funcionam para um estilo de escrita de números do Reino Unido que é comum: +44 (0) 1234 567890 que significa discar o número internacional:
+441234567890
ou no Reino Unido disque 01234567890

Se você quer apenas verificar que você não tem lixo random no campo (ou seja, de spammers), este regex deve funcionar bem:

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

Note que não tem regras especiais para quantos dígitos, ou que números são válidos nesses dígitos, apenas verifica que apenas dígitos, parênteses, traços, mais, espaço, libra, asterisco, ponto final, 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ê alguma necessidade de permitir colchetes quadrados, cacheados ou em ângulo para algumas regiões? (atualmente eles não estão incluídos).

Se você quiser manter as regras por dígito (como em códigos de área dos EUA e prefixos (códigos de troca) deve cair no intervalo de 200-999) bem, boa sorte para você. Manter um conjunto de regras complexo que pode estar desatualizado em qualquer ponto no futuro por qualquer país do mundo não parece divertido.

E, embora a remoção de todos / a maioria dos caracteres não numéricos funcione bem no servidor (especialmente se você estiver planejando passar esses valores para um discador), talvez você não queira espionar a input do usuário durante a validação, especialmente se desejar que eles faça correções em outro campo.

Você já deu uma olhada no RegExLib ?

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

Eu achei isso para funcionar 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 esses formatos numéricos:

 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 sinalizadores globais e multilinhas para ter certeza.

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

Se você está falando sobre validação de formulário, o regexp para validar o significado correto, assim como os dados corretos, será extremamente complexo, devido aos padrões variados de país e provedor. Também será difícil manter-se atualizado.

Eu interpreto a questão procurando por 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 validar a linha tronco, a troca, etc. para o padrão válido para o prefixo de código do país .

A América do Norte é simples e, para os internacionais, prefiro usar um padrão “idiomático” que cubra as maneiras pelas quais as pessoas especificam e lembram 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 for incluído, ambos são. As contas internacionais para uma inicial opcional ‘+’ e código do país. Depois disso, você está no idioma. Correspondências válidas seriam:

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

Isso pode ser tendencioso, pois minha experiência é limitada à América do Norte, Europa e um pouco da Ásia.

Minha tentativa de um regex irrestrito:

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

Aceita:

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

Rejeita:

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

Cabe a você higienizar para exibição. Depois de validar, pode ser um número.

Este é um padrão simples de expressão regular para os números de telefone celular 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á corresponder a estes:

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

O primeiro corresponderá a QUALQUER código de país com dois dígitos, enquanto o segundo corresponderá exclusivamente ao código do país das Filipinas.

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

Minha intuição é reforçada pela quantidade de respostas a esse tópico – que existe um número virtualmente infinito de soluções para esse problema, e nenhuma delas será elegante.

Honestamente, eu recomendo que você não tente validar números de telefone. Mesmo se você pudesse escrever um grande e poderoso validador que permitisse todos os diferentes formatos legítimos, ele acabaria permitindo praticamente qualquer coisa, mesmo remotamente parecendo um número de telefone em primeiro lugar.

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

Você terá dificuldade em lidar com números internacionais com uma regex única / simples, veja este post sobre as dificuldades dos números de telefone internacionais (e até da América do Norte).

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

Além disso – a lista que você deu não inclui outro formato comum dos EUA – deixando de fora o primeiro. A maioria dos celulares nos Estados Unidos não exige isso, e vai começar a confundir a geração mais jovem, a menos que tenha discado internacionalmente.

Você identificou corretamente que é um problema complicado …

-Adão

Depois de ler essas respostas, parece que não havia uma expressão regular direta que pudesse analisar um monte de texto e extrair números de telefone em qualquer formato (incluindo internacional com e sem o sinal de mais).

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

Até agora, tem trabalhado com tudo o que eles lançaram, mas se erros aparecerem, atualizarei essa resposta.

Regex:

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

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

 function phoneToTel($number) { $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '$1 ($3) $4-$5', $number); // includes international return $return; } 

Aqui está um padrão maravilhoso que mais se aproxima da validação que eu precisava alcançar. Eu não sou o autor original, mas acho que vale a pena compartilhá-lo, pois achei esse problema muito complexo e sem uma resposta concisa ou amplamente útil.

A regex a seguir irá capturar combinações de números e caracteres amplamente usadas em uma variedade de formatos de números de telefone globais:

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

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

Aqui está minha melhor tentativa até agora. Ele lida com os formatos acima, mas tenho certeza de que estou perdendo 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}))?$ 

Eu acredito que o Number :: Phone :: US e Regexp :: Common (particularmente a fonte do Regexp :: Common :: URI :: RFC2806 ) módulos Perl poderiam ajudar.

A questão provavelmente deve ser especificada com um pouco mais de detalhes 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 nenhum valor de x. Isso é para que a companhia telefônica possa calcular quando você terminar de discar. Existem várias variações sobre esse problema. Mas o seu regex não verifica a porção do código de área, então isso não parece ser uma preocupação.

Assim como a validação de endereços de e-mail, mesmo que você tenha um resultado válido, não será possível saber se ele está atribuído a alguém até que você o teste.

Se você está tentando validar a input do usuário, por que não normalizar o resultado e acabar com isso? Se o usuário inserir um número que você não consiga reconhecer como um número válido, salve-o como inserido ou remova os caracteres não disponíveis. O módulo Number :: Phone :: Normalize Perl pode ser uma fonte de inspiração.

Eu trabalho para uma empresa de pesquisa de mercado e temos que filtrar esses tipos de insumos o tempo todo. Você está complicando demais. Apenas retire os caracteres não alfanuméricos e veja se há uma extensão.

For further analysis you can subscribe to one of many providers that will give you access to a database of valid numbers as well as tell you if they’re landlines or mobiles, disconnected, etc. It costs money.

Do a replace on formatting characters, then check the remaining for phone validity. 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 ); 

Breaking a complex regexp like this can be just as effective, but much more simple.

I found this to be something interesting. I have not tested it but it looks as if it would work

 "; $number = '123-555-555'; if(validate_telephone_number($number, $formats)) { echo $number.' is a valid phone number.'; } echo "
"; $number = '1800-1234-5678'; if(validate_telephone_number($number, $formats)) { echo $number.' is a valid phone number.'; } echo "
"; $number = '(800) 555-123'; if(validate_telephone_number($number, $formats)) { echo $number.' is a valid phone number.'; } echo "
"; $number = '1234567890'; if(validate_telephone_number($number, $formats)) { echo $number.' is a valid phone number.'; } ?>

You would probably be better off using a Masked Input for this. That way users can ONLY enter numbers and you can format however you see fit. I’m not sure if this is for a web application, but if it is there is a very click jQuery plugin that offers some options for doing this.

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

They even go over how to mask phone number inputs in their tutorial.

Here’s one that works well in JavaScript. It’s in a string because that’s what the Dojo widget was expecting.

It matches a 10 digit North America NANP number with optional extension. Spaces, dashes and periods are accepted delimiters.

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

I was struggling with the same issue, trying to make my application future proof, but these guys got me going in the right direction. I’m not actually checking the number itself to see if it works or not, I’m just trying to make sure that a series of numbers was entered that may or may not have an extension.

Worst case scenario if the user had to pull an unformatted number from the XML file, they would still just type the numbers into the phone’s numberpad 012345678x5 , no real reason to keep it pretty. That kind of RegEx would come out something like this for me:

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

My inclination is to agree that stripping non-digits and just accepting what’s there is best. Maybe to ensure at least a couple digits are present, although that does prohibit something like an alphabetic phone number “ASK-JAKE” for example.

A couple simple perl expressions might be:

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

Use the first one to keep the digit groups together, which may give formatting clues. Use the second one to trivially toss all non-digits.

Is it a worry that there may need to be a pause and then more keys entered? Or something like 555-1212 (wait for the beep) 123?

  pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" validateat="onsubmit" 

Must end with a digit, can begin with ( or + or a digit, and may contain + – ( or )

For anyone interested in doing something similar with Irish mobile phone numbers, here’s a straightforward way of accomplishing it:

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

PHP


  

There is also a JQuery solution on that 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 classs $('#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

    Intereting Posts