Formantando nomes com caracteres especiais em PHP

Este artigo trata de uma coisa bem peculiar, que é a formatação de nomes com caracteres especiais. Por exemplo, o nome MÁRCIO quando passado por essa função vai gerar um retorno Márcio, isso é bem útil quando se está importando dados ou até mesmo criando formulários de cadastro.

[ Hits: 29.049 ]

Por: marcio em 23/02/2004


Introdução



A principio vocês podem pensar que é fácil formatar um nome. Vou explicar por miúdos como seria.

Pegue a variável que vem como maiúscula para a função e dê um strtolower() nela, ficando tudo minúsculo, depois de um explode() nessa variável, separando-a por espaços e dê um ucfirst() em cada uma dessas palavras separadas.

E aquelas que tem que ficar maiúsculas? Por exemplo, o "de", "da", "o", "a", tipo "Márcio de Carvalho", reparem que o "de" não pode ser maiúsculo, logo faremos um if dentro desta função colocando tudo que não pode ser alterado de minúsculo para maiúsculo, mas tem também os que não podem ficar minúsculos, que são os algarismos romanos, logo temos que fazer esta verificação para eles também.

Trocando em miúdos, a função strtolower() nativa do PHP não torna minúsculas as palavras que contém caracteres especiais, portanto a palavra "MÁRCIO" ficaria "mÁrcio" se déssemos um strtolower() nela.

Escrevi este artigo para satisfazer os brasileiros que querem usar uma função para formatar nomes.

Segue abaixo as funções utilizadas, a primeira realiza apenas substituições de caracteres "Á" para "á" e a segunda é a função propriamente dita que formata o nome:

<?php
function troca_caracter_especial($var)
{
   $vetor_troca['Á']='á';
   $vetor_troca['À']='à';
   $vetor_troca['Â']='â';
   $vetor_troca['Ã']='ã';
   $vetor_troca['É']='é';
   $vetor_troca['È']='è';
   $vetor_troca['Ê']='ê';
   $vetor_troca['Í']='í';
   $vetor_troca['Ì']='ì';
   $vetor_troca['Î']='î';
   $vetor_troca['Ó']='ó';
   $vetor_troca['Ò']='ò';  
   $vetor_troca['Ô']='ô';
   $vetor_troca['Õ']='õ';
   $vetor_troca['Ú']='ú';
   $vetor_troca['Ù']='ù';  
   $vetor_troca['Û']='û';
   $vetor_troca['Ç']='ç';

   if( array_key_exists( $var,$vetor_troca ) ):
     return($vetor_troca["$var"]);
   else:
     return($var);  
   endif;        
}

function formata_nome($var)
{
   // Dá um lowercase() na variável toda
   $var = strtolower($var);
   $var2 = '';

   for( $j=0;$j<strlen($var);$j++ ):
     $var2 .= troca_caracter_especial($var[$j]);
   endfor;

   $var = $var2;
   $tmp = explode(" ",$var);
   $knome = "";

   for($i=0;$i<count($tmp);$i++):
     if (($tmp[$i]=='e') or ($tmp[$i] == "de") or ($tmp[$i] == "da") or ($tmp[$i] == "do") or ($tmp[$i] == "di") or ($tmp[$i] == "dos") or ($tmp[$i]=="ii") or ($tmp[$i]=="iii") or ($tmp[$i]=="vi") or ($tmp[$i]=="iv") or ($tmp[$i]=="ix") or ($tmp[$i]=="xx")):
        $compara = strtoupper($tmp[$i]);

        if (($compara=="II") or ($compara=="III") or ($compara=="VI") or ($compara=="IV") or ($compara=="IX") or ($compara=="XX")):
           $knome_upper = strtoupper($tmp[$i]);
           $knome .= " ".$knome_upper;
        else:
           $knome .= " ".$tmp[$i];
        endif;
     else:
        $knome_upper = ucfirst($tmp[$i]);
        $knome .= " ".$knome_upper;
     endif;
   endfor;

   $knome = trim($knome);
   return($knome);
}
?>

Bom, é isso! Qualquer dúvida me mandem um email ou ICQ: diretor@mnw.com.br
ICQ: 59081986


   

Páginas do artigo
   1. Introdução
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

PHP 5 - Compilando com as melhores práticas com PHP 4

Criando gráficos com a classe JPGraph (parte 1)

Turck MMcache completo e sem mistérios

Acessando o Twitter de 5 formas: protocolo HTTP, cURL, classe HttpRequest (PHP), função http_post_fields() do PHP ou PHP+libcurl

Capturando conteúdo de sites em PHP

  
Comentários
[1] Comentário enviado por fabio em 23/02/2004 - 15:32h

Olá Márcio, funcção muito útil, parabéns! Agora veja se a função array_search() ajuda a tornar seu código mais limpo. Ao invés de usarmos vários OR no if, veja se isso ajuda:

$lista = array("e", "de", "da", "do", "di", "dos", "ii", "iii", "vi", "iv", "ix", "xx");
if (array_search($tmp[$i], $lista)) {
...
}

[]'s

[2] Comentário enviado por marciocm em 25/02/2004 - 18:51h

mais tarde farei um upgrade nela, tipo eu fiz isso em 15 minutos para entregar um sistema num cliente, já colquei isso numa classe bem mais estruturado, irei postar tambem futuramente uma classe que fiz para upload de arquivos, bem simples e facil de usar.

[3] Comentário enviado por jeffestanislau em 26/02/2004 - 18:53h

muito interssante, vou fazer uns testes!!!

[4] Comentário enviado por lalinden em 10/07/2009 - 19:23h


Segue abaixo uma codificacao mais atualizada que faz a mesma coisa mais rapidamente
---------------------------------------------------------------------------------------------------------

function trocaAcento( $string )
{
$search = array( 'Á', 'À', 'Ã', 'É', 'Ê', 'Í', 'Ó', 'Õ', 'Ú', 'Ç' );
$replace = array( 'á', 'à', 'ã', 'é', 'ê', 'í', 'ó', 'õ', 'ú', 'ç' );

return str_replace($search, $replace, $string);
}

function formata_nome( $str )
{
$vp = array( "a", "i", "e", "de", "da", "do", "di", "dos", "ii", "iii", "vi", "iv");

$knome = "";

$tmp = explode(" ", strtolower( $this->trocaAcento( $str ) ));

foreach( $tmp as $word )
{
$knome .= " ".(in_array($word, $vp) ? $word : ucfirst( $word ));
}

return trim($knome);
}


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts