PHP Máscara CNPJ, CPF, Data e qualquer outra coisa

Publicado: novembro 12, 2010 em PHP

Opa!

Escrevi uma função para aplicar máscara em campos/valores como cpf, cnpj, data, hora, coordenadas estelares e o que desejar.

É bem simples, estou sem sono e resolvi escrever algo, é eu gosto de escrever aqui huahuha.
Quer ver o script e eu aqui com papo de sonâmbulo… então tá!


<?

function mask($val, $mask)
{
 $maskared = '';
 $k = 0;
 for($i = 0; $i<=strlen($mask)-1; $i++)
 {
 if($mask[$i] == '#')
 {
 if(isset($val[$k]))
 $maskared .= $val[$k++];
 }
 else
 {
 if(isset($mask[$i]))
 $maskared .= $mask[$i];
 }
 }
 return $maskared;
}

?>

Exemplo de uso:


<?

$cnpj = "11222333000199";
$cpf = "00100200300";
$cep = "08665110";
$data = "10102010";

echo mask($cnpj,'##.###.###/####-##');
echo mask($cpf,'###.###.###-##');
echo mask($cep,'#####-###');
echo mask($data,'##/##/####');

?>

Saídas:
11.222.333/0001-99
001.002.003-00
08665-110
10/10/2010

A saída é exatamente como você definir com os “#”, você pode utilizar qualquer separador, qualquer caracter, ex:


<?

$data = "10102010";

echo mask($data,'##/##/####');
echo mask($data,'[##][##][####]');
echo mask($data,'(##)(##)(####)');

?>

Saídas:
10/10/2010
[10][10][2010]
(10)(10)(2010)

Exemplo esquisito que ninguém jamais utilizará:


<?

$hora = "021050";

echo mask($hora,'Agora são ## horas ## minutos e ## segundos');
echo mask($hora,'##:##:##');

?>

Saídas:
Agora são 02 horas 10 minutos e 50 segundos
02:10:50  (esse você vai usar, claro)

Enfim, desde que a quantidade de # seja igual a quantidade de números, ou seja  lá o que contiver a variável, porque não se limita apenas à números, poderia ser:


 <?

 $str = "adoleta";

 echo mask($str,'#-##-##-##');

 ?>

 

Saída: a-do-le-ta


<?

$valor = "100000";

echo mask($valor,'#.###,##');

?>

Sáida: 1.000,00

Pensou que era brincadeira o lance da coordenada estelar né ? tá bão!


<?

$coord_estelar = "10100505";
echo mask($coord_estelar,'p=(#.#,#.#,#.#,#.#)');

?>

Saída: p=(1.0,1.0,0.5,0.5)

É isso galera, sigam as estrelas!
abs

Comentários
  1. Adriano Aidar disse:

    Nossa muito loko simples e direto, já tinha visto um código parecido mais esse é curto e grosso diret ao ponto muito bom.

  2. Marcelo Souza disse:

    Bem bacana esta dica, já usei e após algumas adaptações funcionou bem.
    Valeu!

  3. Raphael disse:

    Realmente é muito bom. Venho acompanhando seu blog à algumas semanas e gostaria de elogia-lo, pois está muito bem organizado ^^

    Bom, te vejo enquando minha saga para aprender JQuery continua :D

    • Rafael Clares disse:

      Opa! Obrigado pelo elogio! Também sou muito fã do JQuery, tenho algumas coisas aqui para postar mas tá meio corrido para mim, entre elas tem um textarea estilo o do facebook que vai aumentando conforme a necessidade, com o essa function que fiz basta adicionar uma class css no textarea e o resto ele faz sozinho é bacana, assim que der eu vou posta-la. Abs

  4. Jairus Lopes disse:

    Boa noite !!

    Esta é a primeira vez que visito este blog e gostei muito, pois tenho algumas dúvidas e as dicas do Rafael estão sendo muito importantes para mim.

    Parabéns para você
    Deus continue te dando esta sabedoria !!!

  5. Marlon disse:

    Muuuuuuuuuito brigado

  6. Luiz disse:

    Olá amigo, achei bastante simples seu codigo mas objetivo… tenho os dados de um telefone no banco 9681125235 quando eu puxo ele para dentro do input ele aparece assim (96) 8112-5235 usando o seu codigo… Mas eu gostaria que voce incrementasse uma solução para caixas do que estejam em branco, onde eu digite e ele já vai separando (xx) xxxx-xxxx porém ele deve salvar no banco de dados sem esses caracteres “divisores”… Se voce puder me ajudar agradeço…

  7. Raphael disse:

    Descobri algo legal, se você usar:
    $hora = array(“021050″, “1″, “2″);
    echo mask($hora, ‘Agora são # horas # minutos e # segundos’);

    O retorno será:
    Agora são 021050 horas 1 minutos e 2 segundos

  8. fabio disse:

    Na pratica pra valores onde o comprimento é variável , tido uma totalização de relatório, esta função não funciona …

    • Rafael Clares disse:

      Fábio e você poderia dar um exemplo prático que não funcione, digo, um número ou o exemplo que não funcionou para você ?
      Se o comprimento é variável os parâmetros devem ser também dinâmicos, enfim, espero que possa nos informar o que não deu certo só para o seu comentário não desvalorizar a função sem antes vermos.
      Abraço e obrigado por participar.

  9. Wilson disse:

    Gostei muito da sua dica.
    Gostaria de saber se existe alguma maneira de fazer uma function que no momento em que eu for digitando os dados, por exemplo o CEP, ele coloque automaticamente o ” – ” após o quinto numero, somente com o PHP, sem usar javascript, para o caso da pessoa desabilitá-lo.
    Um abraço

    • Rafael Clares disse:

      Wilson, o PHP trabalha do “lado servidor”, ou seja, só executado à partir do comento em que é enviada a consulta.
      Para criar alguma interatividade com a interface deve ser uma linguagem que é executada no “lado cliente” que nesse caso pode ser o JavaScript.
      Agora, o ideal é que se o usuário desativou o Javascript, então ele deverá digitar os dados com ou sem a máscara e você formata os dados no PHP ao recebe-los.
      Em outras palavras para criar uma máscara enquanto o usuário digita você precisa usar linguagens no cliente (browser).

      Se lhe interessar algo em js para criar na digitação veja esse link:
      http://www.ajaxianos.com.br/2009/03/mascara-para-campos-de-texto-jquery/

      abraços

  10. Parabéns muito bom mesmo!
    Vamos manter contato se quiser :)

  11. Danilo Moraes disse:

    Desculpa o linguajar chulo, mas essa máscara foi foda, era a solução ideal pro meu projeto pois possui código simples e limpo. Abraços.

  12. agenteweb disse:

    Do caralho! Obrigado mesmo!

  13. jorge santos disse:

    bom, mas se a tabela já está no formato da mask, ae ao buscar ele gera erros igual a este 01..09.8.9/83/0-00.
    O ideal seria ele fazer alterarção somente nos casos que o numero estivesse sem mask ou se existir a mask, mante-la.

    • Rafael Clares disse:

      Nossa, tá bom de lógica em irmão!
      Veja, não acha mais fácil você usar a mask apenas para inser no banco e ao ler não utiliza-la, ou então, armazenar os dados sem traços ou pontos e utilizar a mask apenas ao exibir os dados?
      Verificar sem necessidade se o número está ou não com mascara sendo que eu posso ter certeza de que ele está ou não?
      O ideal é saber como será gravado no banco para não precisar existir “os casos queo numero estivesse sem mask ou existir a mask, mante-la”.
      Ate mais, abs

  14. Cara… parabens pela simplicidade do código.
    Muito bom.

  15. Gustavo disse:

    Excelente dica! ja incorporei à minha bilbioteca de funções.

  16. Marcos Martins disse:

    Parabéns, realmente excelente o site e principalmente esse código camaleão.

  17. antonio disse:

    muito boa essa configuração!!!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s