Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá para todos... Mais uma função para nosso acervo..
Em um projeto que estou gerenciando surgiu a necessidade de abreviar nomes que viriam do banco de dados, o problema é que não achei script algum na web. Resolvi então desenvolver uma função, que me atendeu muito bem por sinal, e quero compartilhá-la com a comunidade, der repente alguém precise em um futuro próximo, em fim, é melhor sobrar do que faltar. rs
Bom, a função está toda comentada, porém ainda assim se surgir alguma duvida, postem. Não criei algo muito complexo, pois o simples me atendeu. Quanto aos nomes compostos, não criei nenhuma regra para tal, somente para preposições como de, do, da, etc..
A função pode ser melhorada, fiquem a vontade.
Segue abaixo:
Código:
function abrevia($nome) {
/* Função para abreviar nomes do meio (sobrenome)
-- > Não está completa e pode ser melhorada
-- > Até o momento não tem regras para nomes compostos
-- > Desenvolvido por: Leonardo Marriel
-- > Contato: leomarriel@hotmail.com
*/
$nome = explode(" ", $nome); // cria o array $nome com as partes da string
$num = count($nome); // conta quantas partes o nome tem
if($num == 2) { // se tiver somente nomes, não abrevia
return $nome; // retorna nome original
}
else { // pelo contrário executa a função
$count = 0;
$novo_nome = ''; // variavel que irá concatenar as partes do nome
foreach($nome as $var) { // loop no array
if($count == 0) {$novo_nome .= $var.' ';} // mostra primeiro nome
$count++; // acrescenta +1 na no contador
/* agora só irá abreviar os nomes do meio, com a condição abaixo, porém, se for algum contido no array de preposições mais comuns, não irá abreviar */
if(($count >= 2) && ($count < $num)) {
$array = array('do', 'Do', 'DO', 'da', 'Da', 'DA', 'de', 'De', 'DE', 'dos', 'Dos', 'DOS', 'das', 'Das', 'DAS');
if(in_array($var, $array)) {
$novo_nome .= $var.' '; // não abreviou
} // fim if array
else {
$novo_nome .= substr($var, 0, 1).'. '; // abreviou
} // fim else
} // fim if nomes do meio
if($count == $num) {$novo_nome .= $var;} // mostra último nome, quando o contador (count) alcançar o número total de valores do array $nome
} // fim foreach
return $novo_nome; // retorna novo nome
} // fim else
} // fim da função
Execução:
<?php
$nome = 'José Francisco da Silva Sauro';
echo abrevia($nome);
// ou
echo abrevia('José Francisco da Silva Sauro');
?>Bruno, obrigado pelas melhorias, no entanto, o mais simples já me atende, caso alguém queira modificar, fique a vontade.
abços.
Cara seu script salvou minha vida, aqui na empresa eu estava precisando dessa função para fazer insert no banco de dados que recebo os dados de um formulário e teria que fazer do zero na mão mas com seu script só alterei um pouquinho para atender minha necessidade e já fico joia.
NESSE SCRIPT ADAPTADO DO SEU ALÉM DE ABREVIAR O PRIMEIRO SOBRENOME, MAS TAMBÉM ABREVIA TODOS OS SOBRENOMES EXCETO O ULTIMO E CLARO O PRIMEIRO NOME.
function valida_nome ($Nome){
// Calcula a quantidade de caracteres do nome
$quantidade = strlen($Nome);
//Variavel para fazer a comparacao se passou da quantidade maxima permitida
$maximo_caracter = 20;
// if para fazer a comparação e decidir se é necessario fazer o tratamento do nome
if($quantidade<$maximo_caracter){
return $Nome;
}
$Nome = explode(" ", $Nome); // cria o array $nome com as partes da string
$num = count($Nome); // conta quantas partes o nome tem
$novo_nome = '';
// variavel que irá concatenar as partes do nome
$espacos = " ";
//Variaveis para controle qual sobrenome o foreach está
$count = 1;
foreach($Nome as $var) { // loop no array
//echo "<br/> Num ".$num."Count ".$count;
if (($count == 1) || ($count == $num)) {
$novo_nome .= $var.' '; // Atribui o primeiro nome
//$count++;
}
//Quando for para segunda posição do array, que é o primeiro sobrenome e que não
//seja maior do que a quantidade de sobrenome do nome
if(($count >= 2) && ($count < $num)) {
// Quando aparecer um desses entao nao atribui
$array = array('do', 'Do', 'DO', 'da', 'Da', 'DA', 'de', 'De', 'DE', 'dos', 'Dos', 'DOS', 'das', 'Das', 'DAS');
//Compara se a variavel var do foreach tem algum dos conteudos nao permitos
//do array
if(in_array($var, $array)) {
// não Atribui para o nome novo
}else {
$novo_nome .= substr($var, 0, 1).'. '; // abreviou
} // fim
}
$count++;
}//Final do Foreach
return $novo_nome;
}//Final da Função
Claudio Ramos De Oliveira
claudio.ramosti@yahoo.com.br
Usano as dicas do @Bruno Augusto, fiz a minha função para abreviar, um pouco mais curta.
function FiltraNome($nome)
{
return !(preg_match('/\bd[eoa]s?\b|\be\b/i', $nome));
}
function valida_nome ($Nome){
$StrLen = strlen($Nome);
$MaxLength = 20;
if($MaxLength <= $StrLen)
{
return $Nome;
}
$Nomes = explode(' ',$Nome);
if(count($Nomes) > 2)
{
$Primeiro = array_shift($Nomes);
$Ultimo = array_pop($Nomes);
$Nomes = array_filter($Nomes, 'FiltraNome');
foreach ($Nomes as &$_nome) {
$_nome = strtoupper(substr($_nome,0,1)).'.';
}
$Nome = $Primeiro.' '.implode(' ',$Nomes).' '.$Ultimo;
}
return $Nome;
}
Já que desde o começo você está se baseando num array de componentes, dá pra melhorar isso aí:
Essa é a forma mais longa pois você pode fazer tudo isso dentro de preg_replace_callback() de uma só vez.