Esta função reduz uma string até um limite máximo de caracteres sem cortar palavras ao meio. Pode-se reduzir a string pela sua extremidade direita (padrão da função), esquerda, ambas ou pelo centro. Por padrão, serão adicionados três pontos "..." à parte reduzida da string, mas pode-se modificar isto através do parâmetro $append. Por exemplo, você poderia querer que ela incluísse três pontos entre parênteses: "(...)", ou que ela não incluísse coisa alguma: "".
A função remove também o excesso de espaços (" ", <TABS> ou <ENTERS>), de forma que ela tentará retornar o máximo de palavras sem exceder o limite imposto por $max_length.
Exemplos de como utilizar:
<?php
$str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
echo str_reduce($str, 100);
/* Retornará:
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut ..."
*/
echo str_reduce($str, 100, "(...)", STR_REDUCE_LEFT);
/* Retornará:
"(...) cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
*/
?>
Obs: pra reduzir por ambas as extremidades, você deverá passar dois valores no quarto parâmetro da função. Para isso, utilize o operador bit a bit "|" desta forma:
(STR_REDUCE_LEFT | STR_REDUCE_RIGHT)
Código-fonte da função:
<?php
define("STR_REDUCE_LEFT", 1);
define("STR_REDUCE_RIGHT", 2);
define("STR_REDUCE_CENTER", 4);
/*
* function str_reduce (str $str, int $max_length [, str $append [, int $position [, bool $remove_extra_spaces ]]])
*
* @return string
*
* Reduz uma string sem cortar palavras ao meio. Pode-se reduzir a string pela
* extremidade direita (padrão da função), esquerda, ambas ou pelo centro. Por
* padrão, serão adicionados três pontos (...) à parte reduzida da string, mas
* pode-se configurar isto através do parâmetro $append.
* Mantenha os créditos da função.
*
* @autor: Carlos Reche
* @data: Jan 21, 2005
*/
function str_reduce($str, $max_length, $append = NULL, $position = STR_REDUCE_RIGHT, $remove_extra_spaces = true)
{
if (!is_string($str))
{
echo "<br /><strong>Warning</strong>: " . __FUNCTION__ . "() expects parameter 1 to be string.";
return false;
}
else if (!is_int($max_length))
{
echo "<br /><strong>Warning</strong>: " . __FUNCTION__ . "() expects parameter 2 to be integer.";
return false;
}
else if (!is_string($append) && $append !== NULL)
{
echo "<br /><strong>Warning</strong>: " . __FUNCTION__ . "() expects optional parameter 3 to be string.";
return false;
}
else if (!is_int($position))
{
echo "<br /><strong>Warning</strong>: " . __FUNCTION__ . "() expects optional parameter 4 to be integer.";
return false;
}
else if (($position != STR_REDUCE_LEFT) && ($position != STR_REDUCE_RIGHT) &&
($position != STR_REDUCE_CENTER) && ($position != (STR_REDUCE_LEFT | STR_REDUCE_RIGHT)))
{
echo "<br /><strong>Warning</strong>: " . __FUNCTION__ . "(): The specified parameter '" . $position . "' is invalid.";
return false;
}
if ($append === NULL)
{
$append = "...";
}
$str = html_entity_decode($str);
if ((bool)$remove_extra_spaces)
{
$str = preg_replace("/\s+/s", " ", trim($str));
}
if (strlen($str) <= $max_length)
{
return htmlentities($str);
}
if ($position == STR_REDUCE_LEFT)
{
$str_reduced = preg_replace("/^.*?(\s.{0," . $max_length . "})$/s", "\\1", $str);
while ((strlen($str_reduced) + strlen($append)) > $max_length)
{
$str_reduced = preg_replace("/^\s?[^\s]+(\s.*)$/s", "\\1", $str_reduced);
}
$str_reduced = $append . $str_reduced;
}
else if ($position == STR_REDUCE_RIGHT)
{
$str_reduced = preg_replace("/^(.{0," . $max_length . "}\s).*?$/s", "\\1", $str);
while ((strlen($str_reduced) + strlen($append)) > $max_length)
{
$str_reduced = preg_replace("/^(.*?\s)[^\s]+\s?$/s", "\\1", $str_reduced);
}
$str_reduced .= $append;
}
else if ($position == (STR_REDUCE_LEFT | STR_REDUCE_RIGHT))
{
$offset = ceil((strlen($str) - $max_length) / 2);
$str_reduced = preg_replace("/^.{0," . $offset . "}|.{0," . $offset . "}$/s", "", $str);
$str_reduced = preg_replace("/^[^\s]+|[^\s]+$/s", "", $str_reduced);
while ((strlen($str_reduced) + (2 * strlen($append))) > $max_length)
{
$str_reduced = preg_replace("/^(.*?\s)[^\s]+\s?$/s", "\\1", $str_reduced);
if ((strlen($str_reduced) + (2 * strlen($append))) > $max_length)
{
$str_reduced = preg_replace("/^\s?[^\s]+(\s.*)$/s", "\\1", $str_reduced);
}
}
$str_reduced = $append . $str_reduced . $append;
}
else if ($position == STR_REDUCE_CENTER)
{
$pattern = "/^(.{0," . floor($max_length / 2) . "}\s)|(\s.{0," . floor($max_length / 2) . "})$/s";
preg_match_all($pattern, $str, $matches);
$begin_chunk = $matches[0][0];
$end_chunk = $matches[0][1];
while ((strlen($begin_chunk) + strlen($append) + strlen($end_chunk)) > $max_length)
{
$end_chunk = preg_replace("/^\s?[^\s]+(\s.*)$/s", "\\1", $end_chunk);
if ((strlen($begin_chunk) + strlen($append) + strlen($end_chunk)) > $max_length)
{
$begin_chunk = preg_replace("/^(.*?\s)[^\s]+\s?$/s", "\\1", $begin_chunk);
}
}
$str_reduced = $begin_chunk . $append . $end_chunk;
}
return htmlentities($str_reduced);
}
?>
Pergunta
Beraldo
Script postado por: Illidan
Reduzir uma string sem cortar palavras ao meio
Esta função reduz uma string até um limite máximo de caracteres sem cortar palavras ao meio. Pode-se reduzir a string pela sua extremidade direita (padrão da função), esquerda, ambas ou pelo centro. Por padrão, serão adicionados três pontos "..." à parte reduzida da string, mas pode-se modificar isto através do parâmetro $append. Por exemplo, você poderia querer que ela incluísse três pontos entre parênteses: "(...)", ou que ela não incluísse coisa alguma: "".
A função remove também o excesso de espaços (" ", <TABS> ou <ENTERS>), de forma que ela tentará retornar o máximo de palavras sem exceder o limite imposto por $max_length.
Exemplos de como utilizar:
Obs: pra reduzir por ambas as extremidades, você deverá passar dois valores no quarto parâmetro da função. Para isso, utilize o operador bit a bit "|" desta forma: Código-fonte da função:Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.