Obter os primeiros n caracteres de uma sequência

320

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?

Alex
fonte
5
talvez seja melhor usar o caractere reticências ...
Keet
1
confira minha resposta se precisar evitar o corte de palavras.
TechNyquist
Tente este link, podem ajudá-lo ... stackoverflow.com/a/26098951/3944217
edCoder

Respostas:

578
//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 wordwrapfunçã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;
}
Brendan Bullen
fonte
11
poderia ser melhor para substituir com reticências (...) em vez de 3 pontos (...)
Keet
3
Adoro isso, mas mudei e use o seguinte para remover os espaços em branco no final: $ string = substr (trim ($ string), 0,10) .'... '; Dessa forma, você recebe algo como "eu gosto de ..." em vez de "eu gosto de ...".
Kenton de Jong
28
"hellip" - Levei algum tempo para compreender que não estávamos falando sobre endereço IP de Satanás
Lucas Bernardo Sousa
2
A atualização 3 é a mais útil.
milkovsky
Caso exista um limite máximo no comprimento da string retornada, a linha 5 da atualização 3 não deve ser $string = wordwrap($string, $length - sizeof($append)); ?
Michael Crenshaw
115

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 trimmarkerreticências acima estão incluídas no comprimento truncado.

Bruchowski
fonte
4
Funcionou perfeitamente para mim. A resposta principal não funcionou, e fico feliz por não ter continuado a rolar e encontrar esta jóia.
Eduardo
Obrigado, eu sempre usei esse método mais longo e mais antigo!
precisa saber é
1
Dan, você pode querer ser um pouco mais específico sobre qual parte da resposta principal não funcionou para você. A função truncate () funcionou perfeitamente para mim e a vantagem dessa resposta sobre a resposta de bruchowski é que ela quebra nos limites das palavras; assumindo que você se preocupa com esse tipo de coisa.
Pdwalker #
2
boa pegada! muitos desenvolvedor PHP experiente não sabe sobre esta função :)
jroi_web
1
A resposta superior (agora) ( stackoverflow.com/a/3161830/236306 ) não fez nada (como se eu não tivesse usado o fn). Não sei porque. Essa resposta, no entanto, parece perfeita e veio com o benefício adicional de trabalhar.
Alan Alan
15

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) . '...';
}
Emil Vikström
fonte
Esse código está adicionando os três pontos à string? meu código tem uma tag de link <a> e quando eu o vinculo, ele o vincula aos três pontos, que terão um valor diferente.
fello 17/05
9

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

}
MortalViews
fonte
9

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.

TechNyquist
fonte
8

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 = '&#8230;')
    {
        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 = '&#8230;')
    {
        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;
            }       
        }
    }
}
Mateus
fonte
4

Use substring

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";
Dlongnecker
fonte
3
Esse código sempre adiciona ... à string, o que ele não queria.
TravisO 06/07/10
Você está absolutamente certo e eu editei a resposta de acordo. (Resposta atualmente aguardando revisão Revisado SO ponto)
Chaya Cooper
3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
HCL
fonte
De @Brendon Bullen acima .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; Agradável !
MarcoZen
1

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 .

Benjamin Crouzier
fonte
1

Isto é o que eu faço

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

onde $ num representa o número de caracteres e $ tt a cadeia de caracteres para manipulação.

christoz
fonte
1

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
:)

Saikelu
fonte
1

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, '..');
tfont
fonte
1

É 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;
    }
}
TravisO
fonte
1
Isso não funcionará porque trim () já existe.
Gordon
Poderia explicar por que essa abordagem é melhor em vez de apenas afirmar que é?
Robert
1
@ Robert é simples, e abstração significa que você não precisa redigitar o código repetidamente. E o mais importante, se você encontrar uma maneira melhor de fazer isso ou quiser algo mais complexo, altere apenas essa função 1 em vez de 50 partes de código.
TravisO 06/07/10
2
Por que a função é maiúscula?
Carlo
Correção: substr de $ var, não $ string. Teste contra o $limit + 3modo que você não cortar uma corda apenas acima do limite. Dependendo do seu aplicativo (por exemplo, saída HTML), considere usar uma entidade &hellip;(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 ().
Phil Perry
1

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

Sergiy Sokolenko
fonte
0

substr () seria melhor, você também deve verificar o comprimento da string primeiro

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

o wordwrap não cortará a corda, apenas a dividirá ...

tsgrasser
fonte
0

$ largura = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

ou com wordwrap

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
akond
fonte
0

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;
}
Waqleh
fonte
0
$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;
Jaykishan
fonte
0

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, $previewserá "Knowledge is a natural right of every human being".

Exemplo de código ao vivo: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

jim_kastrin
fonte