Como posso obter os primeiros n caracteres de uma string no PHP? Qual é a maneira mais rápida de aparar uma sequência para um número específico de caracteres e acrescentar '...' se necessário?
Como posso obter os primeiros n caracteres de uma string no PHP? Qual é a maneira mais rápida de aparar uma sequência para um número específico de caracteres e acrescentar '...' se necessário?
Respostas:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
Atualizar:
Com base na sugestão de verificar o comprimento (e também garantir comprimentos semelhantes em cordas cortadas e não aparadas):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Então você terá uma sequência de no máximo 13 caracteres; 13 (ou menos) caracteres normais ou 10 caracteres seguidos por '...'
Atualização 2:
Ou como função:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Atualização 3:
Já faz um tempo desde que escrevi esta resposta e não uso mais esse código. Eu prefiro esta função que evita quebrar a string no meio de uma palavra usando a wordwrap
função:
function truncate($string,$length=100,$append="…") {
$string = trim($string);
if(strlen($string) > $length) {
$string = wordwrap($string, $length);
$string = explode("\n", $string, 2);
$string = $string[0] . $append;
}
return $string;
}
$string = wordwrap($string, $length - sizeof($append));
?
Essa funcionalidade foi incorporada ao PHP desde a versão 4.0.6. Veja os documentos .
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
Observe que as trimmarker
reticências acima estão incluídas no comprimento truncado.
A extensão Multibyte pode ser útil se você precisar de controle sobre o conjunto de caracteres da string.
$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
$string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
Às vezes, você precisa limitar a string à última palavra completa, ou seja: você não deseja que a última palavra seja quebrada, mas para com a segunda última palavra.
por exemplo: precisamos limitar "This is my String" a 6 caracteres, mas em vez de 'This i ... "queremos que seja' This ...", ou seja, ignoraremos as letras quebradas na última palavra.
ufa, sou péssimo em explicar, aqui está o código.
class Fun {
public function limit_text($text, $len) {
if (strlen($text) < $len) {
return $text;
}
$text_words = explode(' ', $text);
$out = null;
foreach ($text_words as $word) {
if ((strlen($word) > $len) && $out == null) {
return substr($word, 0, $len) . "...";
}
if ((strlen($out) + strlen($word)) > $len) {
return $out . "...";
}
$out.=" " . $word;
}
return $out;
}
}
Se você deseja cortar com cuidado para não dividir as palavras, faça o seguinte
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$buff=strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
se $ str for menor que $ n_chars, o retornará intocado.
Se $ str for igual a $ n_chars, também retornará.
se $ str for maior que $ n_chars, procurará o próximo espaço a ser cortado ou (se não houver mais espaços até o final) $ str será cortado de maneira grosseira em vez de $ n_chars.
NOTA: esteja ciente de que esse método removerá todas as tags no caso de HTML.
A estrutura do codeigniter contém um auxiliar para isso, chamado "auxiliar de texto". Aqui está uma documentação do guia do usuário do codeigniter que se aplica: http://codeigniter.com/user_guide/helpers/text_helper.html (basta ler as seções word_limiter e character_limiter). Aqui estão duas funções relevantes para sua pergunta:
if ( ! function_exists('word_limiter'))
{
function word_limiter($str, $limit = 100, $end_char = '…')
{
if (trim($str) == '')
{
return $str;
}
preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
if (strlen($str) == strlen($matches[0]))
{
$end_char = '';
}
return rtrim($matches[0]).$end_char;
}
}
E
if ( ! function_exists('character_limiter'))
{
function character_limiter($str, $n = 500, $end_char = '…')
{
if (strlen($str) < $n)
{
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n)
{
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val)
{
$out .= $val.' ';
if (strlen($out) >= $n)
{
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
A função que eu usei:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
Veja em ação .
Eu desenvolvi uma função para esse uso
function str_short($string,$limit)
{
$len=strlen($string);
if($len>$limit)
{
$to_sub=$len-$limit;
$crop_temp=substr($string,0,-$to_sub);
return $crop_len=$crop_temp."...";
}
else
{
return $string;
}
}
você apenas chamar a função com corda e limite
por exemplo: str_short("hahahahahah",5)
;
vai cortar o seu barbante e adicionar "..." no final
:)
Para criar dentro de uma função (para uso repetido) e comprimento dinâmico limitado, use:
function string_length_cutoff($string, $limit, $subtext = '...')
{
return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}
// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);
// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');
É melhor abstrair seu código assim (observe que o limite é opcional e o padrão é 10):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
modo que você não cortar uma corda apenas acima do limite. Dependendo do seu aplicativo (por exemplo, saída HTML), considere usar uma entidade …
(tipograficamente mais agradável). Como sugerido anteriormente, apare as letras que não sejam letras do final da string (abreviada) antes de acrescentar as reticências. Por fim, observe se você está em um ambiente multibyte (por exemplo, UTF-8) - não é possível usar strlen () e substr ().
Não tenho certeza se esta é a solução mais rápida, mas parece que é a mais curta:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Veja alguns exemplos aqui https://stackoverflow.com/a/17852480/131337
esta solução não corta palavras, adiciona três pontos após o primeiro espaço. Editei a solução @ Raccoon29 e substituí todas as funções por funções mb_ , para que funcione em todos os idiomas, como árabe
function cut_string($str, $n_chars, $crop_str = '...') {
$buff = strip_tags($str);
if (mb_strlen($buff) > $n_chars) {
$cut_index = mb_strpos($buff, ' ', $n_chars);
$buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
}
return $buff;
}
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
while(strlen($yourString) > 22) {
$pos = strrpos($yourString, " ");
if($pos !== false && $pos <= 22) {
$out = substr($yourString,0,$pos);
break;
} else {
$yourString = substr($yourString,0,$pos);
continue;
}
}
} else {
$out = $yourString;
}
echo "Output String: ".$out;
Se não houver um requisito rígido no comprimento da sequência truncada, pode-se usar isso para truncar e impedir o corte da última palavra também:
$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";
// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);
// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));
// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));
Neste caso, $preview
será "Knowledge is a natural right of every human being"
.
Exemplo de código ao vivo: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713