Truncar string em modelos de lâmina Laravel

95

Existe um modificador de truncamento para os modelos de lâmina no Laravel, muito parecido com o Smarty?

Eu sei que poderia simplesmente escrever o php real no modelo, mas estou procurando por algo um pouco melhor para escrever (não vamos entrar em todo o PHP é um debate sobre motor de templates).

Por exemplo, estou procurando algo como:

{{ $myVariable|truncate:"10":"..." }}

Eu sei que poderia usar algo como Twig via compositer, mas estou esperando uma funcionalidade integrada no próprio Laravel.

Caso contrário, é possível criar seus próprios modificadores reutilizáveis, como o Smarty fornece. Eu gosto do fato de que Blade não exagera com toda a sintaxe, mas acho que truncar é uma função muito útil de se ter.

Estou usando o Laravel 4.

fl3x7
fonte
que tal laravel 5?
Hos Mercury
1
@HosMercury Para L5, consulte stackoverflow.com/questions/29281013/…
fl3x7

Respostas:

202

No Laravel 4 e 5 (até 5.7), você pode usar str_limit, que limita o número de caracteres em uma string.

No Laravel 5.8 ou superior, você pode usar o Str::limithelper.

//For Laravel 4 to Laravel 5.5
{{ str_limit($string, $limit = 150, $end = '...') }}
//For Laravel 5.5 upwards
{{ \Illuminate\Support\Str::limit($string, 150, $end='...') }}

Para mais funções auxiliares do Laravel http://laravel.com/docs/helpers#strings

Anil Singh
fonte
Resposta correta, pois o caso de uso está na visualização Blade.
Frisbetarian de
10
Na versão 5.8 os strajudantes foram removidos, você deve usar em seu Illuminate\Support\Str::limit($string)lugar
Hassan Azimi
1
str_limit está obsoleto
Omer
39

O Laravel 4 tem o Str::limitque truncará para o número exato de caracteres e também o Str::wordsque truncará no limite da palavra.

Verificação de saída:

Dustin Graham
fonte
Você sabe se Str::wordsexiste um equivalente de no Larvel 5.2?
Jiedara
1
Não. Parece que agora limita o número de palavras, não de caracteres. github.com/laravel/framework/blob/5.2/src/Illuminate/Support/…
Dustin Graham
Era isso que eu procurava! THX !
Jiedara
33

Edit: Esta resposta foi postada durante o beta do Laravel 4, quando a classe Str não existia. Agora existe uma maneira melhor de fazer isso no Laravel 4 - que é a resposta de Dustin abaixo. Não posso deletar esta resposta devido às regras do SO (não me permite)

O próprio Blade não possui essa funcionalidade.

No Laravel 3 havia a classe Str - que você poderia fazer:

{{ Str::limit($myVariable, 10) }}

Neste estágio, não acredito que a classe Str esteja no Laravel 4 - mas aqui está uma versão dela que você pode incluir no compositor para adicionar ao seu próprio projeto

Laurence
fonte
Obrigado pela sugestão, parece que terei que ceder e usar as portas do
Meido
Hoje o Laravel 4 possui a classe Str. Veja a resposta de Dustin Graham.
trm42 de
Sim, está correto. Quando eu postei esta resposta originalmente, foi durante o Laravel 4 Beta, quando a classe Str não existia
Laurence
Onde está a resposta original? É terrivelmente impossível encontrar qualquer documento para 4.1 agora ... :(
Srneczek,
16

Atualização do Laravel 7. * : Strings fluentes, isto é, uma interface orientada a objetos mais fluente para trabalhar com valores de string, permitindo a você encadear várias operações de string usando uma sintaxe mais legível em comparação com as operações de string tradicionais.

Limite Exemplo:

$truncated = Str::of('The quick brown fox jumps over the lazy dog')->limit(20);

Resultado

The quick brown fox...

palavras Exemplo:

$string = Str::of('Perfectly balanced, as all things should be.')->words(3, ' >>>');

Resultado

Perfectly balanced, as >>>

Atualização do Laravel 6. * : Você precisa deste pacote para funcionar com todos os ajudantes do laravelcomposer require laravel/helpers

Para usar o helper no controlador, não se esqueça de incluir / usar a classe também

use Illuminate\Support\Str;

Atualização do Laravel 5.8

Isso é para lidar com caracteres da string :

{!! Str::limit('Lorem ipsum dolor', 10, ' ...') !!}

Resultado

Lorem ipsu ... 

Isso é para lidar com palavras da string :

{!! Str::words('Lorem ipsum dolor', 2, ' ...') !!}

Resultado

Lorem ipsum ... 

Aqui está a documentação mais recente do auxiliar para lidar com os auxiliares de string do Laravel

Vipertecpro
fonte
1
solução muito limpa. trabalhou para mim. melhor resposta IMO
maximus1127
@ maximus1127 Muito obrigado por seus esforços para aprender, estou feliz por poder ser útil para você.
Vipertecpro
1
Ótimo! Tipo de resposta que eu adoraria ver mais.
mhrabiee
O que acontecerá se você tiver uma string como a dolor de Lorem ipsum, ela retornará o resultado correto?
Rishi
@Rishi Sim, ele retornará o resultado correto, btw qual método você está falando sobre limite? ou palavras?
Vipertecpro
7

Você pode definir o namespace como:

{!! \Illuminate\Support\Str::words($item->description, 10,'....')  !!}
Raman Bhasker
fonte
7

Para manter seu código DRY, e se seu conteúdo vier do seu modelo, você deve adotar uma abordagem um pouco diferente. Edite seu modelo assim (testado em L5.8):

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Comment extends Model
{
    public function getShortDescriptionAttribute()
    {
        return Str::words($this->description, 10, '...');
    }
}
?>

Então, em sua opinião:

{{ $comment->short_description }}
Guillaume Pommier
fonte
2

Isso funciona no Laravel 5:

{!!strlen($post->content) > 200 ? substr($post->content,0,200) : $post->content!!}
Ofor Emma
fonte
2

Você pode definir o limite da string conforme o exemplo abaixo:

<td>{{str_limit($biodata ->description, $limit = 20, $end = '...')}}</td>

Ele exibirá apenas as 20 letras, incluindo espaços em branco e termina com ....

Imagem de exemploMostra o exemplo de limite de string

Ganesh Khadka
fonte
2

Para coisas simples como esta, prefiro fazer um ajudante - por exemplo:

crie um helpers.phparquivo em seu /app/helpers.phpcom o seguinte conteúdo:

<?php
if (! function_exists('short_string')) {
    function short_string($str) {
            $rest = substr($str, 0, 10);
            return $rest;
    }
}

Registre o helper.phpat autoload em seucomposer.json

   "autoload": {
        "files": [
            "app/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    }

Depois disso, você pode usar em seu arquivo blade, por exemplo:

{{ short_string($whatever_as_text) }}

Você pode usar esta função simples, então, globalmente em seu aplicativo.

Stefanr
fonte
1

Você pode usar sub_str:

{{substr($myVariable,10)}}
WalterV
fonte
0

Atualização do Laravel 6:

@php
$value = 'Artificial Intelligence';
$var = Str::limit($value, $limit = 15, $end = '');
print_r($var);
@endphp

<p class="card-text">{{ Illuminate\Support\Str::limit($value, 7) }}</p>
<h2 class="main-head">{!! Str::limit($value, 5) !!}</h2>
Shamsheer
fonte
0

No Laravel 4 e 5 (até 5.7), você pode usar str_limit, que limita o número de caracteres em uma string.

Enquanto no Laravel 7 ou superior, você pode usar o auxiliar Str :: limit.

//For Laravel  to Laravel 7

{{ Illuminate\Support\Str::limit($post->title, 20, $end='...') }}
zahidsoft
fonte
Laravel 7, use apenas {{Str :: limit ($ chamado-> subClient-> name, 10)}}
João Mello