Validar o número de telefone com o JavaScript
(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.
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}
.
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.
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
Se está à procura de 10 e apenas 10 dígitos, ignore tudo menos os dígitos -
return value.match(/\d/g).length===10;
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);
}
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}$/
Processador de números de telefone Javascript com metadados para mais de 200 países: https://github.com/googlei18n/libphonenumber
/^[+]*[(]{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
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");
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".
/^(()?\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.
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
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).
\\(?\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.
/^(()?\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 |
.
/^(()?\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.
/^+?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-5555Estes 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");
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;
}
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
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}
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.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'));
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 .
Muito simples
"9001234567".match(/^\d{10}$/g)