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

  • Autor do post:
  • Categoria do post:PHP DEV
Opa!  php máscara

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

 


<?

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! php máscara
abs

Este post tem 31 comentários

  1. Edson

    legal ! bem simples e útil

  2. ramon

    Muito util

    1. Thiago

      Muito bom!!
      Parabéns pela iniciativa.

      Fiquei pensando…
      Em um site joomla, usando o componente RsForm, como iria trabalhar com este código no arquivo: validation.php ?

      Desde já obrigado.

      1. Rafael Clares

        Thiago, obrigado pelo comentário. Cara, joomla eu só ouço dizer, nunca usei nada disso, nem joomla, drupal e os demais da categoria, logo, vou ficar devendo essa resposta.
        abs

        1. Thiago

          Tudo bem! Eu que agradeço…
          No componente de formulário que eu utilizo (RsForm!Pro) existe um arquivo php chamdo validation.php.
          É nele que estão todas as funções de validação padrão para alguns campos, como por exemplo: e-mail, telephone.
          Tentei entender, mas não consigo imaginar como usar essas máscaras.

          Já joguei a função “mask’, mas na hora de inserir a saída, não estou fazendo certo.

          E estou procurando alguma máscara pronta para este componente, e nada.

          Valeu.
          Um abraço

          1. Rafael Clares

            Thiago, a máscara é melhor indicada na saída cara… Se você gravar no banco com a máscara e depois tentar usar ela também na saída vai dar erro…
            Você deve gravar o valor original no banco, por exemplo uma data “01022013” grava isso no banco e somente na saída você usa a mask.
            É assim que está fazendo ? Ou está mandando com máscara pro banco ? rsr s

  3. William

    Muito bom!

    Abraço

  4. Jeová D Avila

    Parabéns por compartilhar seu conhecimento!

  5. Fábio

    Por favor, de que forma seria possível prever o nono número dos celulares de SP? Por exemplo: quero que a saída tenha 1 ponto no meio, tipo 12345.6789
    ficaria mask($var, #####.####); porém se o cara usa Nextel, o nono número não existe e o resultado seria 12345.678
    Sei que eu poderia utilizar neste caso um if, mas ficaria meio limitado. Como eu poderia fazer algo do tipo, popular os # de trás para frente. Me fiz entender?
    Obrigado

    1. Rafael Clares

      Fábio, não sei bem, antes da portabilidade até seria possível pegar os prefixos das operadoras e colocar em um if/switch para saber se “não é nextel”.

      1. Fábio

        Obrigado, mas resolvi de uma forma mais simples. Com um if mesmo, mas na variável da query mesmo. Utilizei um strlen pra saber se tinha 8 ou 9 dígitos. Zoado, mas resolveu bem.

        1. Rafael Clares

          Nossa, agora que entendi corretamente o que você queria fazer. ;(
          Pensei que queria pegar os números com 8 dígitos e incluir o 9º.
          Não sabia que os 9 números estavam sendo informados.
          Achei excelente sua solução, é sem dúvida, a melhor forma de fazer.
          Abraços

  6. Mateus

    Muito interessante e com uma infinidade de opções de uso!

  7. Vinicius

    valewwww

  8. Vinicius

    Cara muito obrigado…
    muito bom mesmo..
    Sou novo em desenvolvimento e esse tipo de ajuda me deixa muito feliz satisfeito e com vontade de seguir o seu exemplo ajudando outras pessoas

  9. davicrystalDavi

    Muito Bom! Parabéns pelo código, inclui em meu projeto.

    Obrigado 😉

  10. Hélio Araújo de Oliveira

    Tá com uma falha séria, se for integer volta vazio, resolvi com $val = (string) $val;

    1. Tiburcio

      Boa!!

  11. ggwebdev

    Bom artigo Rafael! Quebra um bom galho!!! Grato!

  12. amixel

    Sem duvidas uma função de extrema utilidade! ainda mais que temos que sempre formatar o padrão americano!
    Parabens pela sua colaboração!

  13. Anselmo Gomes

    Ótima função, Rafael! Obrigado por compartilhar com a comunidade.

  14. thiagotomais

    Muito boa a sua ideia! Eu nunca havia pensado dessa forma! Abraço!

  15. JOAQUIM DA SILVEIRA MAIA

    Parabéns!
    Gostei muito da sua colaboração. Todas estas máscaras estava precisando. Foram muito úteis em meu trabalho. Obrigado mesmo!

    1. Rafael Clares

      Obrigado meu amigo, um abraço.

Os comentários estão encerrados.