Validar o número de telefone com o JavaScript

Encontrei este código num site e funciona perfeitamente. Ele verifica se o número de telefone está em um desses formatos:
(123) 456-7890 ou 123-456-7890

O problema é que o meu cliente (não sei porquê, talvez os clientes) quer adicionar outro formato, os dez números consecutivamente, algo assim.: 1234567890.

estou a usar esta expressão regular,

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

Como posso acrescentar que também valida o outro formato? Não sou bom com expressões regulares.

Author: Peter Mortensen, 2010-12-02

23 answers

Em Primeiro Lugar, o seu validador de formato é obviamente apropriado apenas para os números NANP (Código do país +1). A sua candidatura será usada por alguém com um número de telefone de fora da América do Norte? Em caso afirmativo, você não quer impedir essas pessoas de entrar em um número perfeitamente válido [internacional].

Em segundo lugar, a sua validação está incorrecta. Os números NANP assumem a forma NXX NXX XXXX em que N é um dígito 2-9 e X é um dígito 0-9. Além disso, os códigos de área e os intercâmbios podem não assumir o formulário N11 (terminar com dois) para evitar confusão com os serviços especiais excepto os números num código de área não geográfica(800, 888, 877, 866, 855, 900) pode haver uma troca.

Então, o teu regex vai passar o número (123) 123 4566 mesmo que não seja um número de telefone válido. Você pode corrigir isso substituindo \d{3} por [2-9]{1}\d{2}.

Finalmente, tenho a sensação de que estás a validar a entrada do utilizador num navegador web. Lembre-se que a validação do lado do cliente é apenas um conveniência Você fornece ao utilizador ; ainda assim precisa de validar toda a entrada (de novo) no servidor.

TL; DR não use uma expressão regular para validar dados complexos do mundo real, como números de telefone ou URLs. Utilizar uma biblioteca especializada.

 87
Author: josh3736, 2017-05-23 12:10:43

O meu regex de escolha é:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

Formatos válidos:

(123) 456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

 81
Author: EeeeeK, 2017-08-03 15:13:42

Se está à procura de 10 e apenas 10 dígitos, ignore tudo menos os dígitos -

   return value.match(/\d/g).length===10;
 47
Author: kennebec, 2014-09-22 19:03:22

O que eu faria era ignorar o formato e validar o conteúdo numérico:

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}
 27
Author: Paul Schreiber, 2016-11-04 20:26:28

O seguinte REGEX validará qualquer um destes formatos:

(123) 456-7890
123-456-7890
123.456.7890
1234567890

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/
 24
Author: Billbad, 2013-03-14 12:19:40

Processador de números de telefone Javascript com metadados para mais de 200 países: https://github.com/googlei18n/libphonenumber

 17
Author: g1smd, 2015-03-12 16:57:48
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123) 456-7890
+(123) 456-7890
+(123)-456-7890
+(123) - 456-7890
+(123) - 456-78-90
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

Esta é uma opção muito frouxa e eu prefiro mantê-la assim, principalmente eu usá-la em formulários de registro onde os usuários precisam adicionar seu número de telefone. Normalmente, os utilizadores têm problemas com formulários que impõem regras de formatação rigorosas, eu prefiro que o utilizador preencha o número e o formato no display ou antes de salvá-lo na base de dados. http://regexr.com/3c53v

 16
Author: elishas, 2015-11-06 07:39:11

Onde o str pode estar qualquer um destes formarts: 555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555

function telephoneCheck(str) {
  var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
  alert(isphone);
}
telephoneCheck("1 555 555 5555");
 12
Author: Frawel, 2016-03-12 18:42:58
Eu sugiro usar algo mais claro (especialmente pensando em quem terá que manter o código)... que tal:
var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

Onde a expressão regular é construída a partir de um modelo claro ? Adicionando um novo seria então um sem-brainer e pode ser até mesmo o próprio cliente poderia ser capaz de fazer isso em uma página de "opções".

 9
Author: 6502, 2010-12-02 19:03:09
Isto vai funcionar.
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

O carácter ? significa que o grupo anterior deve ser igualado a zero ou uma vez. O grupo (-|\s) irá corresponder quer a um carácter - quer a um carácter |. A adição de ? após a segunda ocorrência deste grupo na sua expressão regular permite-lhe corresponder a uma sequência de 10 dígitos consecutivos.

 4
Author: Donut, 2010-12-02 18:19:38

Tente este-ele inclui validação para formatos internacionais também.

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

Este regex valida o seguinte formato:

  • (541) 754-3010 Doméstico
  • +1-541-754-3010 International {[[10]} 1-541-754-3010 marcado nos EUA
  • 001-541-754-3010 marcado da Alemanha
  • 191 541 754 3010 marcado de França
 4
Author: harinimurugan, 2017-10-25 07:02:09
As respostas de todos são óptimas, mas há uma que acho um pouco mais abrangente...

Isto é escrito para a correspondência javascript usar um único número numa única linha:

^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$
Se quiser corresponder aos limites das palavras, basta mudar o ^ e o $ para o \b Congratulo-me com quaisquer sugestões, correcções ou críticas a esta solução. Tanto quanto posso dizer, isto corresponde ao formato NANP (para números EUA-EU não validei outros países norte-americanos ao criar isso), evita qualquer erro 911( não pode estar no código de área ou código de região), elimina apenas os 555 números que são realmente inválidos (código de região de 555 seguido de 01xx onde x = qualquer número).
 3
Author: Erasmus, 2013-09-25 20:29:42
\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}

Isto validará qualquer número de telefone de formato variável:

\\(?\d{3}\\)? encontra 3 dígitos entre parênteses ou não.

([\-\s\.])? Encontra algum destes caracteres separadores ou não

\d{3} Procura 3 Dígitos

\1 usa o primeiro separador combinado-isto garante que os separadores são os mesmos. Então (000) 999-555555 não irá validar aqui porque existe um separador de espaço e traço, por isso basta remover o "\1" e substituir pelo sub-padrão do separador (fazendo isso irá também validar formatos não normalizados). Você deve, no entanto, ser o formato insinuando para a entrada do usuário de qualquer maneira.

\d{4} procura 4 Dígitos

Validatos:

  • (000) 999 5555
  • (000)-999-5555
  • (000).999.5555
  • (000) 999-5555
  • (000)9995555
  • 000 999 5555
  • 000-999-5555
  • 000.999.5555
  • 0009995555

BTW isto é para JavaScript, portanto, para dupla fuga.

 1
Author: Dacmeaux, 2018-06-01 15:33:28

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

O carácter ? significa que o grupo anterior deve ser igualado a zero ou uma vez. O grupo (-|\s) irá corresponder quer a um carácter - quer a um carácter |.

 0
Author: parijat, 2013-03-12 10:18:03
Tenho de concordar que validar números de telefone é uma tarefa difícil. Quanto a este problema específico, alteraria a expressão regular de
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/

A

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

Como o único elemento que se torna desnecessário é o último traço/espaço.

 0
Author: Luc Veronneau, 2013-03-12 10:26:24

/^+?1?-sim?(?\d{3} (?:) |[- /\s])?-sim?\d{3} [- /\s]?\d{4}$/

Embora este post seja antigo mas queira deixar a minha contribuição. estes são aceites: 5555555555 555-555-5555 (555)555-5555 1(555)555-5555 1 555 555 5555 1 555-555-5555 1 (555) 555-5555

Estes não são aceites: 555-5555- > aceitar esta utilização:^+?1?-sim?(?(\d{3})?(?:) |[- /\s])?-sim?\d{3} [- /\s]?\d{4}$ 5555555- > aceitar este uso:^+?1?-sim?(?(\d{3})?(?:) |[- /\s])?-sim?\d{3} [- /\s]?\d{4}$ 1 555)555-5555 123**&!!asdf# 55555555 (6505552368) 2 (757) 622-7382 0 (757) 622-7382 -1 (757) 622-7382 2 757 622-7382 10 (757) 622-7382 27576227382 (275)76227382 2(757)6227382 2(757)622-7382 (555)5(55?)-5555

Este é o código que usei:

function telephoneCheck(str) {
  var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/);
  return patt.test(str);
}

telephoneCheck("+1 555-555-5555");
 0
Author: Flavio Ferreira, 2017-01-04 14:20:05

Se usar na etiqueta de entrada, este código ajudá-lo-á. Eu escrevo este código sozinho e eu acho que esta é uma maneira muito boa de usar na entrada. mas você pode alterá-lo usando o seu formato. Ele vai ajudar o usuário a corrigir o seu formato na tag de entrada.

$("#phone").on('input', function() {  //this is use for every time input change.
        var inputValue = getInputValue(); //get value from input and make it usefull number
        var length = inputValue.length; //get lenth of input

        if (inputValue < 1000)
        {
            inputValue = '1('+inputValue;
        }else if (inputValue < 1000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
        }else if (inputValue < 10000000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
        }else
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
        }       
        $("#phone").val(inputValue); //correct value entered to your input.
        inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
       if ((inputValue > 2000000000) && (inputValue < 9999999999))
      {
          $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
      }else
      {
          $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
      }
  });

    function getInputValue() {
         var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
        if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
        {
            var inputValue = inputValue.substring(1, inputValue.length);
        }
        return inputValue;
}
 0
Author: , 2017-04-16 04:11:26

Expressão Regular simples: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g

Vê o formato, espero que funcione:
444-555-1234
f:246.555.8888
m: 1235554567

 0
Author: sahed sawon, 2017-08-03 16:07:51

Só queria adicionar uma solução especificamente para selecionar números de telefone não-locais(800 e 900 tipos).

(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}
 0
Author: Mike T, 2017-09-12 17:07:35

O Google tem uma boa biblioteca para lidar com números de telefone em Javascript: https://github.com/googlei18n/libphonenumber . Também funciona com Java e C++.

Eu preferia usar estes, porque este deve ser muito bem testado na produção. Então, isto deve ser seguro para transmitir.
 0
Author: Ville Venäläinen, 2017-12-29 18:27:35

Esta função funcionou bem para nós:

let isPhoneNumber = input => {

  try {
    let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
      //extract numbers from string
      thenum = input.match(/[0-9]+/g).join(""),
      totalnums = thenum.length,
      last10Digits = parseInt(thenum) % 10000000000,
      ISDcode = thenum.substring(0, totalnums - 10);

    //phone numbers are generally of 8 to 16 digits
    if (totalnums >= 8 && totalnums <= 16) {
      if (ISDcode) {
        if (ISD_CODES.includes(parseInt(ISDcode))) {
          return true;
        } else {
          return false;
        }
      } else {
        return true;
      }
    }
  } catch (e) {}

  return false;
}

console.log(isPhoneNumber('91-9773207706'));
 0
Author: student, 2018-01-23 12:48:08

Existem demasiadas variantes regex para validar um número de telefone. Eu recomendo este artigo: JavaScript: validação do formulário HTML - número de telefone, onde são especificadas várias variantes para cada caso. Se quiser aprofundar em regex para uma expressão personalizada, poderá rever esta documentação .

 0
Author: gras, 2018-07-18 15:35:02

Muito simples

"9001234567".match(/^\d{10}$/g)
 0
Author: Nikita Shahov, 2018-09-18 16:57:28