Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maykel-ctba

Regex - Telefone validando errado, onde está o erro?

Recommended Posts

Fala galera,

 

Tenho a seguinte expressão:

/^\(11\) 9\d{4}-\d{4}|\((?:1[2-9]|[2-9]\d)\) [5-9]\d{3}-\d{4}$/

Uso ela tanto via JS quanto PHP para validar um cadastro.

Javascript:

<script>
    var telefonePattern = /^\(11\) 9\d{4}-\d{4}|\((?:1[2-9]|[2-9]\d)\) [5-9]\d{3}-\d{4}$/;
    if(!telefonePattern.test($("#telefone").val()))
    {
        text += 'Telefone digitado em formato inválido. Utilize (xx) xxxx-xxxx.<br/>';
    }
</script>

PHP:

<?php
    $telefonePattern = '/^\(11\) 9\d{4}-\d{4}|\((?:1[2-9]|[2-9]\d)\) [5-9]\d{3}-\d{4}$/';
    if(!preg_match($telefonePattern, $post['telefone']))
    {
        $erro .= "Telefone digitado em formato inválido. Utilize (xx) xxxx-xxxx.<br/>";
    }
?>

A seguinte regra deveria validar:

  • Telefones com formato (xx)xxxx-xxxx, e caso seja DDD 11, pode ter o número adicional (9 digitos).

Ele valida:

  1. (41) 8401-2834

E não valida:

  1. (41) 3252-1060

 

Hahahahaha, qual a encrenca será?

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que você poderia simplificar pra você separando as coisas, um é extraindo o DDD e depois validando o numero apartir do DDD

Compartilhar este post


Link para o post
Compartilhar em outros sites

O conjunto abaixo não fecha, teria de ser \d apenas ou [0-9]

[5-9]
Mas essa é só uma parte do problema, pois nem para 9 dígitos está funcionando.

 

Sua ER está muito complexa para o que ela se propõe. Simplifique-a.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel Heming, bem que eu gostaria, hahah... eu não manjo expressões regulares. Peguei a regra "pronta".

Porém, ela não está fazendo o que se propoe, que é validar telefones fixos e celulares, e se o DDD for 11, pode suportar 9 digitos...

 

Peguei outra agora, mas continua a mesma coisa, valida apenas celulares, acho.

/^(\(11\) [9][0-9]{4}-[0-9]{4})|(\(1[2-9]\) [5-9][0-9]{3}-[0-9]{4})|(\([2-9][1-9]\) [5-9][0-9]{3}-[0-9]{4})$/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça assim:

var resultado = false;
var numero = '(11) 99999-9999';
// Aqui você pegaria o DDD
var ddd = numero .match(/\(([0-9]{2})\)/)[1];

if (ddd == 11)
    resultado = /\(11\) [0-9]{5}\-[0-9]{4}/.test(numero);
else
    resultado = /\([0-9]{2}\) [0-9]{4}\-[0-9]{4}/.test(numero);

Se você achar um lugar com as regras dos números, eu vejo se consigo criar um regex.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e se o DDD for 11, pode suportar 9 digitos...

Nono dígito não é mais uma exclusividade do DDD 11 desde domingo (02/11).

Compartilhar este post


Link para o post
Compartilhar em outros sites

verdade, agora que você falou eu lembrei de ver isso no jornal.

 

Acredito que o melhor é procurar as regras desses números primeiros e depois criar as regras para cada caso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem lembrado @Gabriel!

Para resolver isso, é só criar um array com os DDDs que possuem 9 dígitos e fazer a verificação neste array, acredito!

 

Obrigado @ExtremsX, vou testar aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites
/^(\(11\) [9][0-9]{4}-[0-9]{4})|(\(1[2-9]\) [5-9][0-9]{3}-[0-9]{4})|(\([2-9][1-9]\) [5-9][0-9]{3}-[0-9]{4})$/

Nesse regex aqui, existem 3 regras ( oque for diferente de 0 é pq tem de ser o numero digitado):

 

^(\(11\) [9][0-9]{4}-[0-9]{4}) = (11) 9000-0000

(\(1[2-9]\) [5-9][0-9]{3}-[0-9]{4}) = (1(2 a 9)) (5 a 9)000-0000

(\([2-9][1-9]\) [5-9][0-9]{3}-[0-9]{4}) = ((2 a 9)(1 a 9)) (5 a 9)000-0000

 

Tente descobrir de onde ele pegou essas regras

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só lembre que não deve salvar máscaras no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, infelizmente peguei o projeto já em andamento e os telefones gravados já são gravados com máscara.

Gostaria também de gravar tudo em INT no banco, porém, já que já estava feita "a cagada", vai ser assim hahah

 

Código que funcionou:

/^(\([0-9]{2}\))\s([9]{1})?([0-9]{4})-([0-9]{4})$/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nem em INT, deve ser em string mesmo. O mesmo acontece com RG, CPF, CNPJ e CEP. Se utilizar INT, zeros a esquerda serão perdidos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem problema em perder os zeros a esqueda

Desde que ele tome cuidado com o preechimento dos zeros à esquerda, não terá problemas

 

Mas eu ainda usaria char/varchar. Apesar de serem só números, o valor deles não interessa, como um único número. Aliás, no caso do CPF, de 11 dígitos, teríamos que criar um campo BIGINT. Outros casos poderiam até causar overflow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os dados devem ser normalizados antes de inserir no SGBD. Se precisarem ser normalizados na, ou após a, recuperação (SELECT, por exemplo) existe um problema de integridade.

 

Apesar de máscaras possuirem, normalmente, uma quantidade fixa de caracteres (telefone não mais), não é uma opção válida contar e reinserir os zeros.

 

Só como adendo, mas não total do escopo é claro, RG também possui letras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.