Alejandro Moraga – 6:16 am

Cortar strings sem cortar palavras

cut-head

Extrair parte de um texto é uma tarefa que precisa de um pouco de cuidado. Um simples substr pode acabar cortando uma palavra ao meio, dando um novo significado ao texto. Observe o exemplo abaixo:

substr('Programa transforma celulares comuns em smartphone', 0, 25);
>> Programa transforma celula

De “celulares” passou a ser “celula”. A frase teve um novo significado.

Sushiman

function truncate($str, $len, $etc='') {
	$end = array(' ', '.', ',', ';', ':', '!', '?');

	if (strlen($str) <= $len)
		return $str;

	if (!in_array($str{$len - 1}, $end) && !in_array($str{$len}, $end))
		while (--$len && !in_array($str{$len - 1}, $end));

	return rtrim(substr($str, 0, $len)).$etc;
}

Truncate corta strings tomando cuidado para não separar palavras ao meio ou em qualquer outra parte. É muito possível que o valor retornado tenha menos caracteres que o solicidado, mas temos a certeza que nenhuma palavra será quebrada.

Exemplos:

$str = 'Estrelas pequenas e com pouco brilho, conhecidas como anãs vermelhas, são muito mais comuns do que se imaginava.';
substr($str, 0, 50);
>> Estrelas pequenas e com pouco brilho, conhecidas co

truncate($str, 50);
>> Estrelas pequenas e com pouco brilho, conhecidas

truncate($str, 50, '...');
>> Estrelas pequenas e com pouco brilho, conhecidas...