Laravel 5: แสดง HTML ด้วยเบลด


283

ฉันมีสตริงที่กลับไปยังมุมมองของฉันเช่นนี้:

$text = '<p><strong>Lorem</strong> ipsum dolor <img src="images/test.jpg"></p>'

ฉันพยายามแสดงด้วย Blade:

{{$text}}

อย่างไรก็ตามผลลัพธ์เป็นสตริงดิบแทนที่จะเป็น HTML ที่แสดงผล ฉันจะแสดง HTML ด้วย Blade ใน Laravel 5 ได้อย่างไร

PS PHP echo()แสดง HTML อย่างถูกต้อง


2
{!! nl2br($post->description) !!}เหมาะกับฉันถ้าฉันมีที่ว่างและ br
มูฮัมหมัดชาห์ซาด

คำตอบ:


652

คุณต้องใช้

{!! $text !!}

{{ $text }}สตริงรถยนต์จะหลบหนีเมื่อใช้


5
นี่คือเอกสาร Laravel ที่กล่าวถึงสิ่งนี้: "หากคุณไม่ต้องการให้ข้อมูลของคุณถูกหลบหนีคุณอาจใช้ไวยากรณ์ต่อไปนี้: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan

1
ฉันยังสงสัยเกี่ยวกับสิ่งที่ @Ryan พูดถึง นี่ไม่ใช่ปัญหาด้านความปลอดภัยหรือไม่?
sanders

@sanders อาจเป็นปัญหาด้านความปลอดภัยหาก$textมีการป้อนข้อมูลของผู้ใช้และคุณไม่ได้หลบหนีอย่างถูกต้อง ตัวอย่างเช่น$text = 'Hello <b>'.$_GET['name'].'</b>';มีอันตรายเพราะ$_GET['name']อาจรวมถึง HTML ซึ่งจะอนุญาตให้ XSS คุณสามารถทำได้$text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';และจะปลอดภัย
Christopher K.

ยานี้ไม่ได้ทำเคล็ดลับทั้งหมด! ถ้าผมมีสิ่งที่ชอบและฉันอยากจะแสดงไว้ในใบมันจะมีลักษณะเช่นนี้<meta cc="grâce à"> <meta cc="gr&acirc;ce &agrave;">ดังนั้นคำตอบสำหรับฉันคือ @Praveen_Dabral 's
brahimm



18

โปรดใช้

{!! $test !!} 

เฉพาะในกรณีของ HTML ในขณะที่ถ้าคุณต้องการที่จะแสดงข้อมูลต่อย ฯลฯ ใช้

{{ $test }}

นี่เป็นเพราะเมื่อไฟล์เบลดของคุณถูกคอมไพล์

{{ $test }}ถูกแปลงเป็น<?php echo e($test) ?> ในขณะที่

{!! $test !!} ถูกแปลงเป็น <?php echo $test ?>


13

มีวิธีอื่น หากวัตถุประสงค์วัตถุคือการแสดงผล html คุณสามารถใช้\Illuminate\Contracts\Support\Htmlableสัญญาที่มีtoHtml()วิธีการ

จากนั้นคุณสามารถแสดงผลวัตถุนั้นจากเบลดเช่นนี้: {{ $someObject }}(หมายเหตุไม่จำเป็นต้องใช้{!! !!}ไวยากรณ์)

นอกจากนี้หากคุณต้องการส่งคืนคุณสมบัติ html และคุณรู้ว่ามันจะเป็น html ให้ใช้\Illuminate\Support\HtmlStringคลาสดังนี้:

public function getProductDescription()
{
    return new HtmlString($this->description);
}

{{ $product->getProductDescription() }}แล้วใช้มันเหมือน

แน่นอนว่าต้องรับผิดชอบเมื่อแสดงผล html ดิบบนหน้าเว็บโดยตรง


11

ลองสิ่งนี้ มันใช้งานได้สำหรับฉัน

{{ html_entity_decode($text) }}

ในเทมเพลต Laravel Blade {{}} จะหลบหนี html หากคุณต้องการแสดง html จากคอนโทรลเลอร์ในมุมมองให้ถอดรหัส html จากสตริง


3
นี้ไม่ถูกต้องอยู่เหนือคำตอบมันสามารถทำได้ในทางของคุณมันก็สับสน porgrammer
Milad

8

คุณสามารถใช้ได้ {!! $ text !!} สำหรับการแสดงผลโค้ด HTML ใน Laravel

{!! $text !!}

ถ้าคุณใช้

{{ $text }}

มันจะไม่แสดงผลโค้ด HTML และพิมพ์เป็นสตริง


5

ใช้{!! $text !!}เพื่อแสดงข้อมูลโดยไม่ต้องหลบหนี เพียงให้แน่ใจว่าคุณไม่ได้ทำสิ่งนี้กับข้อมูลที่มาจากผู้ใช้และยังไม่ได้รับการทำความสะอาด



5

คุณสามารถทำได้หลายวิธีใน laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}

หากคุณเก็บแท็กที่เข้ารหัส (& lt; p & gt; hello world. & lt; / p & gt;) ในฐานข้อมูลโค้ดข้างบนใช้งานได้ ... ขอบคุณ !!!
narasimharaosp

4

คุณสามารถทำได้โดยใช้สามวิธีก่อนหากเงื่อนไขดังต่อไปนี้

{!! $text !!}

วิธีที่สองคือ

<td class="nowrap">
@if( $order->status == '0' )
    <button class="btn btn-danger">Inactive</button>
@else
    <button class="btn btn-success">Active</button>
@endif
</td>

วิธีที่สามและเหมาะสมสำหรับการใช้งานผู้ประกอบการบนใบมีด

<td class="nowrap">
      {!! $order->status=='0' ? 
          '<button class="btn btn-danger">Inactive</button> : 
          '<button class="btn btn-success">Active</button> !!}
</td>

ฉันหวังว่าวิธีที่สามจะสมบูรณ์แบบสำหรับผู้ประกอบการที่ใช้ประกอบไปด้วยใบมีด


4

หากต้องการเพิ่มคำอธิบายเพิ่มเติมโค้ดภายใน{{ }}ข้อความสั่งBlade จะถูกส่งผ่านไปยังhtmlspecialchars()ฟังก์ชันที่ php จัดเตรียมโดยอัตโนมัติ ฟังก์ชั่นนี้ใช้เวลาในสตริงและจะค้นหาตัวละครที่สงวนไว้ทั้งหมดที่ HTML ใช้ ตัวละครลิขสิทธิ์เป็นและ& < > "จากนั้นจะแทนที่อักขระที่สงวนไว้เหล่านี้ด้วยตัวแปรเอนทิตี HTML ของพวกเขา ซึ่งมีดังต่อไปนี้:

|---------------------|------------------|
|      Character      |       Entity     |
|---------------------|------------------|
|          &          |       &amp;      |
|---------------------|------------------|
|          <          |       &lt;       |
|---------------------|------------------|
|          >          |       &gt;       |
|---------------------|------------------|
|          "          |       &quot;     |
|---------------------|------------------|

ตัวอย่างเช่นสมมติว่าเรามีคำสั่ง php ดังต่อไปนี้:

$hello = "<b>Hello</b>";

ส่งผ่านเบลดตามที่{{ $hello }}จะให้ค่าสตริงตามตัวอักษรที่คุณผ่าน:

<b>Hello</b>

ใต้ฝากระโปรงมันจะสะท้อนออกมาอย่างแท้จริง &lt;b&gt;Hello&lt;b&gt

หากเราต้องการหลีกเลี่ยงสิ่งนี้และทำให้มันเป็นแท็กตัวหนาเราหนีออกมาจาก htmlspecialchars()ฟังก์ชั่นโดยการเพิ่มเบลดไวยากรณ์ของ escape:

{!! $hello !!}

โปรดทราบว่าเราใช้วงเล็บปีกกาเพียงอันเดียว

ผลลัพธ์ข้างต้นจะให้ผล:

สวัสดี

นอกจากนี้เรายังสามารถใช้ฟังก์ชั่นที่มีประโยชน์อีกอย่างที่ php จัดให้ซึ่งเป็นhtml_entity_decode()ฟังก์ชั่น สิ่งนี้จะแปลงเอนทิตี HTML เป็นอักขระ HTML ที่ยอมรับ คิดว่ามันเป็นสิ่งที่ตรงกันข้ามhtmlspecialchars()

ตัวอย่างเช่นเรามีคำสั่ง php ต่อไปนี้:

$hello = "&lt;b&gt; Hello &lt;b&gt;";

ตอนนี้เราสามารถเพิ่มฟังก์ชั่นนี้ลงในคำสั่งเบลดของเรา:

{!! html_entity_decode($hello) !!}

สิ่งนี้จะใช้เอนทิตี HTML &lt;และแยกวิเคราะห์เป็นรหัส HTML <ไม่ใช่เฉพาะสตริง

เช่นเดียวกันจะนำไปใช้กับองค์กรที่ใหญ่กว่า &gt;

ซึ่งจะให้ผลผลิต

สวัสดี

จุดทั้งหมดของการหลบหนีในสถานที่แรกคือการหลีกเลี่ยงการโจมตี XSS ดังนั้นโปรดระมัดระวังเมื่อใช้ไวยากรณ์การหลีกเลี่ยงโดยเฉพาะอย่างยิ่งหากผู้ใช้ในแอปพลิเคชันของคุณให้ HTML ด้วยตนเองพวกเขาสามารถฉีดโค้ดของตัวเองตามที่พวกเขาต้องการ


2

หากคุณต้องการหลบหนีจากการใช้ข้อมูล

{{ $html }}

หากไม่ต้องการหนีการใช้ข้อมูล

{!! $html !!}

แต่จนถึง Laravel-4 คุณสามารถใช้ได้

{{ HTML::link('/auth/logout', 'Sign Out', array('class' => 'btn btn-default btn-flat')) }}

เมื่อมาถึง Laravel-5

{!! HTML::link('/auth/logout', 'Sign Out', array('class' => 'btn btn-default btn-flat')) !!} 

คุณสามารถทำได้ด้วยฟังก์ชั่น PHP

{{ html_entity_decode($data) }}

ผ่านเอกสาร PHP สำหรับพารามิเตอร์ของฟังก์ชั่นนี้

html_entity_decode - php.net


2

ใช้งานได้ดีกับ Laravel 5.6

<?php echo "$text"; ?>

ในวิธีที่แตกต่าง

{!! $text !!}

มันจะไม่แสดงผลโค้ด HTML และพิมพ์เป็นสตริง

สำหรับรายละเอียดเพิ่มเติมเปิดลิงก์: - แสดง HTML ด้วยเบลด



0

ฉันเคยไปที่นั่นและมันเป็นความผิดของฉัน และหนึ่งที่โง่มาก

หากคุณลืมนามสกุล. blade ในชื่อไฟล์ไฟล์นั้นจะไม่เข้าใจเบลด แต่รันโค้ด php คุณควรใช้

/resources/views/filename.blade.php

แทน

/resources/views/filename.php

หวังว่านี่จะช่วยได้บ้าง



0

หากคุณใช้คลาส Bootstrap Collapse บางครั้ง{!! $text !!} ก็ใช้ไม่ได้สำหรับฉัน แต่{{ html_entity_decode($text) }}ใช้ได้สำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.