【问题标题】:Truncate string in Laravel blade templates在 Laravel 刀片模板中截断字符串
【发布时间】:2013-02-07 09:27:19
【问题描述】:

在 Laravel 中是否有刀片模板的截断修饰符,很像 Smarty?

我知道我可以在模板中写出实际的 php,但我正在寻找更好的写法(让我们不要进入整个 PHP 是模板引擎的争论)。

例如,我正在寻找类似的东西:

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

我知道我可以通过 composer 使用 Twig 之类的东西,但我希望 Laravel 本身具有内置功能。

如果没有,是否可以像 Smarty 提供的那样创建自己的可重用修饰符。我喜欢 Blade 的所有语法都不会过度杀伤的事实,但我认为 truncate 是一个非常方便的功能。

我正在使用 Laravel 4。

【问题讨论】:

标签: php laravel laravel-blade template-engine texttrimming


【解决方案1】:

Str::words 方法限制字符串中的单词数。可以通过其第三个参数将附加字符串传递给此方法,以指定应将哪个字符串附加到截断字符串的末尾:

use Illuminate\Support\Str;

return Str::words('Perfectly balanced, as all things should be.', 3, ' >>>');

// Perfectly balanced, as >>>

您可以将第三个参数传递给该方法以更改将附加到截断字符串末尾的字符串:

use Illuminate\Support\Str;

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

// The quick brown fox (...)

【讨论】:

    【解决方案2】:

    下面的例子,使用 laravel 8。

    {!! Str::words("$post->content", 8, ' ...') !!}

    {!! Str::limit("$post->content", 15, ' ...') !!}

    【讨论】:

      【解决方案3】:

      你可以使用 sub_str:

      {{substr($myVariable,10)}}
      

      【讨论】:

        【解决方案4】:

        在 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) }}
        【解决方案5】:

        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 Helpers的最新帮助文档

        【讨论】:

        • 非常干净的解决方案。为我工作。最佳答案海事组织
        • @maximus1127 非常感谢您为学习付出的努力,很高兴能为您提供帮助。
        • 太棒了!我希望看到更多的答案。
        • 如果你有像 Lorem ipsum's dolor 这样的字符串会发生什么,它会返回正确的结果吗?
        • @Rishi 是的,它会返回正确的结果,顺便说一句,你说的是哪种方法限制?还是文字?
        【解决方案6】:

        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>
        

        【讨论】:

          【解决方案7】:

          在 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

          【讨论】:

          • 正确答案,因为用例在刀片视图中。
          • 在 5.8 版中,str 助手已被删除,您必须改用 Illuminate\Support\Str::limit($string)
          • str_limit 已弃用
          • 前 3 个字符:{{ \Illuminate\Support\Str::limit($string, 0, 3) }}
          【解决方案8】:

          对于像这样简单的事情,我更愿意做一个助手 - 例如:

          在您的/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"
                  ]
              }
          

          之后你可以在你的刀片文件中使用例如:

          {{ short_string($whatever_as_text) }}
          

          您可以在您的应用中全局使用这个简单的功能。

          【讨论】:

            【解决方案9】:

            为了让您的代码保持干燥,如果您的内容来自您的模型,您应该采用稍微不同的方法。像这样编辑您的模型(在 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 }}
            

            【讨论】:

              【解决方案10】:

              您可以设置字符串限制,如下例:

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

              它将仅显示 20 个字母,包括空格并以 ....结尾。

              示例图片

              【讨论】:

                【解决方案11】:

                这适用于 Laravel 5:

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

                【讨论】:

                  【解决方案12】:

                  你可以像这样设置命名空间:

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

                  【讨论】:

                    【解决方案13】:

                    编辑:这个答案是在 Laravel 4 beta 期间发布的,当时 Str 类不存在。现在在 Laravel 4 中有更好的方法来做到这一点——这是达斯汀在下面的回答。由于 SO 规则,我无法删除此答案(它不会让我这样做)

                    Blade 本身不具备该功能。

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

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

                    现阶段我不相信 Str 类在 Laravel 4 - but here is a port of it that you can include in composer 中添加到您自己的项目中

                    【讨论】:

                    • 感谢您的建议,看来我将不得不屈服并使用 Meido 端口大声笑
                    • 现在 Laravel 4 有 Str 类。请参阅达斯汀格雷厄姆的回应。
                    • 是的 - 这是正确的。当我最初发布这个答案时,它是在 Laravel 4 Beta 期间,当时 Str 类不存在
                    • 原始答案在哪里?现在很难找到任何 4.1 的文档... :(
                    【解决方案14】:

                    Laravel 4 有 Str::limit 将截断到确切的字符数,还有 Str::words 将截断单词边界。

                    退房:

                    【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-08-20
                    • 2013-04-29
                    • 2011-04-24
                    • 2013-07-09
                    • 2017-04-03
                    相关资源
                    最近更新 更多