Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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:
Hahahahaha, qual a encrenca será?
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.
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})$/
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.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).
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
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
>
/^(\(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
Na verdade, apenas gostaria que:
Qualquer numero no formato (xx) xxxx-xxxx e (xx) xxxxx-xxxx fossem aceitos, não importando o DDD. Aí já fica aberto e mais simples...
Esta regex deve resolver, então:
/^\([0-9]{2}\) [0-9]{4,5}-[0-9]{4}$/
Só lembre que não deve salvar máscaras no banco de dados.
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})$/
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.
Não tem problema em perder os zeros a esqueda
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
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.
acho que você poderia simplificar pra você separando as coisas, um é extraindo o DDD e depois validando o numero apartir do DDD