Jump to content
leomarriel

Abreviar nomes do meio (sobrenome)

Recommended Posts

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');

?>

 

 

Share this post


Link to post
Share on other sites

Já que desde o começo você está se baseando num array de componentes, dá pra melhorar isso aí:

 

- Verifica se o número de componentes é maior que dois, como já fez e, se for, remove e armazena numa variável o primeiro e o último elementos, com array_shift() e array_pop(), respectivamente.

 

- Do array resultante você filtra, com array_filter(), removendo todas as entradas que sejam conectivos. Como a filtragem não afeta a string da iteração interna, você pode descapitalizar o valor com strtolower() e encurtar seu array de conectivos, poupando memória.

 

- Como array_filter() pode vir a deixar o array vazio para nomes de 3 componentes onde um deles é um conectivo, você conta de novo e se ainda for maior que zero, com um preg_replace_callback() você substitui toda a palavra pela sua inicial e um ponto literal.

 

- Depois une com implode() o resultado anterior e precedendo-o aquilo que array_shift() retornou e sucedendo-o com a última palavra, vinda de array_pop().

 

Essa é a forma mais longa pois você pode fazer tudo isso dentro de preg_replace_callback() de uma só vez.

  • +1 1

Share this post


Link to post
Share on other sites

Bruno, obrigado pelas melhorias, no entanto, o mais simples já me atende, caso alguém queira modificar, fique a vontade.

 

abços.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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;
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.