ตัดสตริงในเทมเพลต Laravel blade


93

มีตัวแก้ไขการตัดทอนสำหรับเทมเพลตใบมีดใน Laravel ซึ่งค่อนข้างเหมือนกับ Smarty หรือไม่?

ฉันรู้ว่าฉันสามารถเขียน php ที่แท้จริงในเทมเพลตได้ แต่ฉันกำลังมองหาสิ่งที่ดีกว่าเล็กน้อยในการเขียน (อย่าเข้าสู่ PHP ทั้งหมดเป็นการถกเถียงเอ็นจิ้นเทมเพลต)

ตัวอย่างเช่นฉันกำลังมองหาสิ่งที่ต้องการ:

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

ฉันรู้ว่าฉันสามารถใช้บางอย่างเช่น Twig ผ่านนักแต่งเพลงได้ แต่ฉันหวังว่าจะมีฟังก์ชันในตัวใน Laravel เอง

หากไม่สามารถสร้างโมดิฟายเออร์ที่ใช้ซ้ำได้เช่น Smarty ให้ ฉันชอบความจริงที่ว่า Blade ไม่ได้ใช้ไวยากรณ์มากเกินไป แต่ฉันคิดว่าการตัดทอนเป็นฟังก์ชันที่มีประโยชน์อย่างแท้จริง

ฉันใช้ Laravel 4


แล้ว laravel 5 ล่ะ?
Hos Mercury

1
@HosMercury สำหรับ L5 ดูstackoverflow.com/questions/29281013/…
fl3x7

คำตอบ:


199

ใน 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


คำตอบที่ถูกต้องเนื่องจาก use case อยู่ในมุมมอง Blade
Frisbetarian

10
ในตัวstrช่วยรุ่น 5.8 ถูกลบออกคุณต้องใช้Illuminate\Support\Str::limit($string)แทน
Hassan Azimi

1
str_limit เลิกใช้งานแล้ว
Omer

39

Laravel 4 มีStr::limitซึ่งจะตัดทอนจำนวนอักขระที่แน่นอนและStr::wordsจะตัดขอบเขตของคำด้วย

เช็คเอาท์:


คุณรู้หรือไม่ว่ามีStr::wordsอยู่ใน Larvel 5.2 หรือไม่?
Jiedara

1
ไม่ดูเหมือนตอนนี้จะ จำกัด จำนวนคำไม่ใช่อักขระ github.com/laravel/framework/blob/5.2/src/Illuminate/Support/…
Dustin Graham

นั่นคือสิ่งที่ฉันกำลังมองหา! ขอบคุณ !
Jiedara

32

แก้ไข: คำตอบนี้ถูกโพสต์ในช่วง Laravel 4 beta เมื่อไม่มีคลาส Str ตอนนี้มีวิธีที่ดีกว่าใน Laravel 4 - ซึ่งเป็นคำตอบของ Dustin ด้านล่าง ฉันไม่สามารถลบคำตอบนี้ได้เนื่องจากกฎ SO (จะไม่ให้ฉัน)

Blade เองไม่มีฟังก์ชันนั้น

ใน Laravel 3 มีคลาส Str ซึ่งคุณสามารถทำได้:

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

ในขั้นตอนนี้ฉันไม่เชื่อว่าคลาส Str อยู่ใน Laravel 4 - แต่นี่คือพอร์ตของมันที่คุณสามารถรวมไว้ในนักแต่งเพลงเพื่อเพิ่มในโปรเจ็กต์ของคุณเอง


ขอบคุณสำหรับคำแนะนำดูเหมือนว่าฉันจะต้องเจาะลึกและใช้พอร์ต Meido ฮ่า ๆ
fl3x7

ปัจจุบัน Laravel 4 มีคลาส Str ดูการตอบสนองของ Dustin Graham
trm42

ใช่ - ถูกต้อง ตอนแรกที่ฉันโพสต์คำตอบนี้ในช่วง Laravel 4 Beta เมื่อไม่มีคลาส Str
Laurence

คำตอบของ origianl อยู่ที่ไหน? มันเป็นไปไม่ได้ที่จะหาเอกสารใด ๆ สำหรับ 4.1 ในขณะนี้ ... :(
Srneczek

16

การอัปเดตสำหรับ Laravel 7. * : Fluent Stringsคืออินเทอร์เฟซเชิงวัตถุที่คล่องแคล่วมากขึ้นสำหรับการทำงานกับค่าสตริงช่วยให้คุณสามารถเชื่อมโยงการดำเนินการสตริงหลายรายการเข้าด้วยกันโดยใช้ไวยากรณ์ที่อ่านได้มากขึ้นเมื่อเทียบกับการดำเนินการสตริงแบบเดิม

จำกัดตัวอย่าง:

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

เอาต์พุต

The quick brown fox...

คำตัวอย่าง:

$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


1
น้ำยาสะอาดมาก ทำงานให้ฉัน คำตอบที่ดีที่สุด IMO
maximus1127

@ maximus1127 ขอบคุณมากสำหรับความพยายามในการเรียนรู้ฉันดีใจที่มีประโยชน์สำหรับคุณ
Vipertecpro

1
เยี่ยมมาก! คำตอบที่ฉันชอบที่จะเห็นมากขึ้น
mhrabiee

จะเกิดอะไรขึ้นถ้าคุณมีสตริงเช่น dolor ของ Lorem ipsum มันจะส่งคืนผลลัพธ์ที่ถูกต้องหรือไม่?
Rishi

@Rishi ใช่มันจะส่งคืนผลลัพธ์ที่ถูกต้อง btw คุณพูดถึงลิมิตวิธีไหน? หรือคำ?
Vipertecpro


5

เพื่อให้โค้ดของคุณแห้งและหากเนื้อหาของคุณมาจากโมเดลของคุณคุณควรใช้แนวทางที่แตกต่างออกไปเล็กน้อย แก้ไขโมเดลของคุณดังนี้ (ทดสอบใน 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 }}


2

คุณสามารถกำหนดขีด จำกัด สตริงได้ดังตัวอย่างด้านล่าง:

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

จะแสดงเพียง 20 ตัวอักษรรวมทั้งช่องว่างและลงท้ายด้วย ....

ภาพตัวอย่างมันแสดงตัวอย่างของการ จำกัด สตริง


เฮ้บราเดอร์เลิกใช้แล้วอัปเดตคำตอบของคุณ
Mahdi Safari

1

สำหรับสิ่งง่ายๆเช่นนี้ฉันต้องการให้ผู้ช่วย - ตัวอย่างเช่น:

สร้างhelpers.phpไฟล์ใน/app/helpers.phpเนื้อหาของคุณต่อไปนี้:

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

ลงทะเบียนhelper.phpที่ autoload ในไฟล์composer.json

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

หลังจากนั้นคุณสามารถใช้ในไฟล์เบลดของคุณเช่น:

{{ short_string($whatever_as_text) }}

คุณสามารถใช้ฟังก์ชันง่ายๆนี้ได้ทั่วโลกในแอปของคุณ


0

การอัปเดต 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>

0

ใน Laravel 4 & 5 (สูงสุด 5.7) คุณสามารถใช้ str_limit ซึ่ง จำกัด จำนวนอักขระในสตริง

ในขณะที่อยู่ใน Laravel 7 ขึ้นไปคุณสามารถใช้ตัวช่วย จำกัด Str ::

//For Laravel  to Laravel 7

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

Laravel 7 ใช้เฉพาะ {{Str :: limit ($ chamado-> subClient-> name, 10)}}
João Mello
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.