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?
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:
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 .
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).'...';}
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.
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:
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,'..');
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 …(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:
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
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".
Respostas:
Atualizar:
Com base na sugestão de verificar o comprimento (e também garantir comprimentos semelhantes em cordas cortadas e não aparadas):
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:
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:fonte
$string = wordwrap($string, $length - sizeof($append));
?Essa funcionalidade foi incorporada ao PHP desde a versão 4.0.6. Veja os documentos .
Observe que as
trimmarker
reticências acima estão incluídas no comprimento truncado.fonte
A extensão Multibyte pode ser útil se você precisar de controle sobre o conjunto de caracteres da string.
fonte
À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.
fonte
Se você deseja cortar com cuidado para não dividir as palavras, faça o seguinte
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.
fonte
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:
E
fonte
Use substring
http://php.net/manual/en/function.substr.php
fonte
fonte
A função que eu usei:
Veja em ação .
fonte
Isto é o que eu faço
onde $ num representa o número de caracteres e $ tt a cadeia de caracteres para manipulação.
fonte
Eu desenvolvi uma função para esse uso
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
:)
fonte
Para criar dentro de uma função (para uso repetido) e comprimento dinâmico limitado, use:
fonte
É melhor abstrair seu código assim (observe que o limite é opcional e o padrão é 10):
fonte
$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:
PS Veja alguns exemplos aqui https://stackoverflow.com/a/17852480/131337
fonte
substr () seria melhor, você também deve verificar o comprimento da string primeiro
o wordwrap não cortará a corda, apenas a dividirá ...
fonte
$ largura = 10;
ou com wordwrap
fonte
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
fonte
fonte
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:
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
fonte