在Laravel的Blade模板中截取字符串

124

在Laravel的blade模板中,是否有类似于Smarty的截断修饰符?

我知道我可以在模板中直接编写实际的PHP代码,但我正在寻找一种更好的编写方式(让我们不要陷入整个“PHP是一个模板引擎”的辩论中)。

因此,例如,我正在寻找像这样的东西:

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

我知道我可以使用像Twig这样的通过composer安装的工具,但我希望Laravel本身有内置的功能。
如果没有,是否可以创建自己的可重用修饰符,就像Smarty提供的那样。我喜欢Blade不会过度使用所有语法,但我认为truncate是一个真正方便的函数。
我正在使用Laravel 4。

Laravel 5怎么样? - mercury
2
@HosMercury 对于 L5,请参见 https://dev59.com/dF4b5IYBdhLWcg3wWwPP - fl3x7
我希望并祈祷你不再使用 Laravel 4 进行开发了。 :D - Vipertecpro
1
@Vipertecpro 呵呵,那不是很棒吗!Laravel已经走过了漫长的道路。 - fl3x7
15个回答

249
在 Laravel 4 和 5 (直到 5.7 版本),您可以使用 str_limit 来限制字符串中的字符数量。
而在 Laravel 5.8 及以上版本,您可以使用 Str::limit 辅助函数。
//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='...') }}

如需更多Laravel帮助函数,请参见http://laravel.com/docs/helpers#strings


由于使用案例在 Blade 视图中,所以这是正确的答案。 - Frisbetarian-Support Palestine
15
在版本5.8中,str助手被移除了,你必须使用Illuminate\Support\Str::limit($string)来代替。 - Amir Hassan Azimi
1
str_limit已被弃用。 - Omer
首先3个字符:{{ \Illuminate\Support\Str::limit($string, 0, 3) }} - Pedro Cardoso
新增助手函数 str($string)->limit(150, $end) 适用于 Laravel 6+。 - ÄR Âmmãř Żąîñh
新的助手已添加 str($string)->limit(150, $end) Laravel 6+ - undefined

44

你知道在 Laravel 5.2 中是否存在 Str::words 的等效函数吗? - Jiedara
1
不。现在看起来它限制的是单词数量,而不是字符数。https://github.com/laravel/framework/blob/5.2/src/Illuminate/Support/Str.php#L182 - Dustin Graham
那就是我在寻找的!谢谢! - Jiedara

40

Laravel 7更新。*: Fluent Strings是一种更流畅、面向对象的接口,用于处理字符串值,允许您使用比传统字符串操作更可读的语法链接多个字符串操作。

limit示例:

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

输出

The quick brown fox...

words 示例:

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

输出

Perfectly balanced, as >>>

Laravel 6的更新说明*: 您需要此软件包才能使用所有Laravel帮助程序 composer require laravel/helpers

要在控制器中使用辅助函数,请不要忘记同时包含/使用类。

use Illuminate\Support\Str;

Laravel 5.8 更新

以下内容用于处理字符串中的字符:

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

输出

Lorem ipsu ... 

这是用于处理字符串中单词的内容:

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

输出

Lorem ipsum ... 

这里是处理字符串的最新助手文档 Laravel 助手


1
非常干净的解决方案。对我有用。在我看来是最佳答案。 - maximus1127
@maximus1127 非常感谢你为学习所做的努力,我很高兴能对你有所帮助。 - Vipertecpro
1
太好了!我希望能看到更多这样的回答。 - mhrabiee
如果你有像 Lorem ipsum's dolor 这样的字符串,它会返回正确的结果吗? - Risheekant Vishwakarma
@Rishi 是的,它会返回正确的结果。顺便问一下,你是在说 limit 还是 words 这个方法? - Vipertecpro

38

编辑:此答案发布于Laravel 4 beta期间,当时Str类不存在。现在在Laravel 4中有更好的方法 - 就是下面Dustin的回答。由于SO规则(它不允许我),我无法删除此答案

Blade本身没有这个功能。

在Laravel 3中,有一个Str类 - 你可以这样做:

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

在这个阶段,我不认为Laravel 4中有Str类 - 但是这里有一个端口,你可以将其包含在composer中以添加到你自己的项目中。

谢谢建议,看来我不得不妥协并使用Meido端口哈哈 - fl3x7
现在Laravel 4有Str类。请参考Dustin Graham的回答。 - trm42
是的 - 这是正确的。当我最初发布这个答案时,是在 Laravel 4 Beta 期间,那时 Str 类并不存在。 - Laurence
原始答案在哪里?现在找到4.1的文档简直是不可能的... :( - Srneczek

11
为保持您的代码DRY,如果您的内容来自于您的模型,您应该采取稍微不同的方法。请像这样编辑您的模型(已在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, '...');
    }
}
?>

那么根据您的观点:

{{ $comment->short_description }}

8
您可以这样设置命名空间:

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

4

像这样简单的事情,我宁愿制作一个帮助器 - 例如:

在您的/app/helpers.php中创建一个helpers.php文件,内容如下:

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

在您的composer.json中,将helper.php注册到自动加载中。

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

接下来,你可以在你的 Blade 文件中使用,例如:

{{ short_string($whatever_as_text) }}

你可以在应用程序中全局使用此简单功能。

2
这适用于Laravel 5:
{!!strlen($post->content) > 200 ? substr($post->content,0,200) : $post->content!!}

2
您可以按照以下示例设置字符串限制:
<td>{{str_limit($biodata ->description, $limit = 20, $end = '...')}}</td>

它只会显示包括空格在内的20个字母,以...结尾。
示例图片这是一个字符串限制的示例

2
在Laravel 4和5(最高版本为5.7)中,您可以使用str_limit来限制字符串中的字符数。
而在Laravel 7及以上版本中,您可以使用Str::limit助手。
//For Laravel  to Laravel 7

{{ Illuminate\Support\Str::limit($post->title, 20, $end='...') }}

Laravel 7,仅使用{{ Str :: limit($chamado->subClient->name,10)}} - João Mello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接