Laravel 5: Hiển thị HTML bằng Blade


283

Tôi có một chuỗi được trả về một trong những quan điểm của tôi, như thế này:

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

Tôi đang cố gắng hiển thị nó với Blade:

{{$text}}

Tuy nhiên, đầu ra là một chuỗi thô thay vì kết xuất HTML. Làm cách nào để hiển thị HTML với Blade trong Laravel 5?

Tái bút PHP echo()hiển thị HTML chính xác.


2
{!! nl2br($post->description) !!}làm việc cho tôi nếu tôi chỉ có không gian và br.
Muhammad Shahzad

Câu trả lời:


650

Bạn cần sử dụng

{!! $text !!}

Chuỗi sẽ tự động thoát khi sử dụng {{ $text }}.


5
Dưới đây là các tài liệu của Laravel đề cập đến điều này: "Nếu bạn không muốn dữ liệu của mình được thoát, bạn có thể sử dụng cú pháp sau: Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan

1
Tôi cũng đang tự hỏi về những gì @Ryan đã đề cập. Đây không phải là một vấn đề bảo mật?
sanders

@sanders Rất có thể là sự cố bảo mật nếu $textchứa dữ liệu nhập của người dùng và bạn đã không thoát khỏi điều này đúng cách. Ví dụ: $text = 'Hello <b>'.$_GET['name'].'</b>';nguy hiểm vì $_GET['name']có thể bao gồm HTML, cho phép XSS. Bạn có thể làm $text = 'Hello <b>'.htmlentities($_GET['name']).'</b>';và sẽ an toàn.
Christopher K.

Liều này không làm toàn bộ thủ thuật! nếu tôi có thứ gì đó như thế <meta cc="grâce à">và tôi muốn thể hiện nó bằng lưỡi kiếm, nó sẽ trông như thế này <meta cc="gr&acirc;ce &agrave;">. Vì vậy, câu trả lời cho tôi là @Praveen_Dabral
brahimm

58

Đối với ấu trùng 5

{!!html_entity_decode($text)!!}

Tìm hiểu thông qua liên kết này , xem câu trả lời của RachidLaasri


1
Cảm ơn..its làm việc .. {!! html_entity_decode ($ data) !!}
Priyabrata Atha


18

Vui lòng sử dụng

{!! $test !!} 

Chỉ trong trường hợp HTML trong khi bạn muốn kết xuất dữ liệu, sting, v.v.

{{ $test }}

Điều này là do khi tập tin lưỡi của bạn được biên dịch

{{ $test }}được chuyển đổi thành <?php echo e($test) ?> while

{!! $test !!} được chuyển đổi thành <?php echo $test ?>


13

Có một cách khác. Nếu mục đích của đối tượng là kết xuất html, bạn có thể thực hiện \Illuminate\Contracts\Support\Htmlablehợp đồng có toHtml()phương thức.

Sau đó, bạn có thể kết xuất đối tượng đó từ lưỡi kiếm như thế này: {{ $someObject }}(lưu ý, không cần {!! !!}cú pháp).

Ngoài ra nếu bạn muốn trả về thuộc tính html và bạn biết đó sẽ là html, hãy sử dụng \Illuminate\Support\HtmlStringlớp như thế này:

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

và sau đó sử dụng nó như thế nào {{ $product->getProductDescription() }}.

Tất nhiên phải chịu trách nhiệm khi trực tiếp kết xuất html thô trên trang.


11

Thử cái này. Nó làm việc cho tôi.

{{ html_entity_decode($text) }}

Trong mẫu Laravel Blade, {{}} sẽ thoát html. Nếu bạn muốn hiển thị html từ trình điều khiển trong chế độ xem, hãy giải mã html từ chuỗi.


3
Điều này không đúng là ở trên câu trả lời, nó có thể được thực hiện theo cách của bạn, nó chỉ gây nhầm lẫn cho người lập trình
Milad

8

Bạn có thể dùng {!! $ text !!} để kết xuất mã HTML trong Laravel

{!! $text !!}

Nếu bạn dùng

{{ $text }}

Nó sẽ không hiển thị mã HTML và in dưới dạng chuỗi.


5

Sử dụng {!! $text !!}để hiển thị dữ liệu mà không thoát khỏi nó. Chỉ cần chắc chắn rằng bạn không làm điều này với dữ liệu đến từ người dùng và chưa được làm sạch.


5

nó đơn giản

{!! $text !!}

laravel biên dịch thành phần tử dom và {{$text}}in dưới dạng chuỗi


5

bạn có thể làm với nhiều cách trong laravel 5 ..

{!! $text !!}

{!! html_entity_decode($text) !!}

nếu bạn lưu trữ các thẻ được mã hóa (& lt; p & gt; xin chào thế giới. & lt; / p & gt;) trong db trên mã hoạt động ... Cảm ơn !!!
narasimharaosp

4

Bạn có thể làm điều đó bằng cách sử dụng ba cách đầu tiên nếu điều kiện như dưới đây

{!! $text !!}

Cách thứ hai

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

Cách thứ ba và thích hợp để sử dụng toán tử ternary trên lưỡi

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

Tôi hy vọng cách thứ ba là hoàn hảo cho người vận hành ternary đã sử dụng trên lưỡi kiếm.


4

Để thêm giải thích, mã bên trong các {{ }}câu lệnh Blade được tự động chuyển qua htmlspecialchars()chức năng mà php cung cấp. Hàm này có một chuỗi và sẽ tìm thấy tất cả các ký tự dành riêng mà HTML sử dụng. Nhân vật dành riêng là & < >". Sau đó, nó sẽ thay thế các ký tự dành riêng này bằng biến thể thực thể HTML của chúng. Đó là những điều sau đây:

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

Ví dụ: giả sử chúng ta có câu lệnh php sau:

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

Truyền vào lưỡi như {{ $hello }}sẽ mang lại chuỗi ký tự bạn đã vượt qua:

<b>Hello</b>

Dưới mui xe, nó thực sự sẽ vang như &lt;b&gt;Hello&lt;b&gt

Nếu chúng ta muốn bỏ qua điều này và thực sự kết xuất nó như một thẻ in đậm, chúng ta thoát khỏi htmlspecialchars()hàm bằng cách thêm lưỡi cú pháp thoát cung cấp:

{!! $hello !!}

Lưu ý rằng chúng tôi chỉ sử dụng một nẹp xoăn.

Đầu ra của những điều trên sẽ mang lại:

xin chào

Chúng ta cũng có thể sử dụng một hàm tiện dụng khác mà php cung cấp, đó là html_entity_decode()hàm này. Điều này sẽ chuyển đổi các thực thể HTML thành các ký tự HTML được tôn trọng của chúng. Hãy nghĩ về nó như mặt trái củahtmlspecialchars()

Ví dụ: chúng ta có câu lệnh php sau:

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

Bây giờ chúng ta có thể thêm chức năng này vào câu lệnh thoát được thoát:

{!! html_entity_decode($hello) !!}

Điều này sẽ lấy thực thể HTML &lt;và phân tích nó dưới dạng mã HTML <, không chỉ là một chuỗi.

Điều tương tự sẽ được áp dụng với lớn hơn thực thể &gt;

sẽ mang lại

xin chào

Toàn bộ điểm thoát ra ở nơi đầu tiên là để tránh các cuộc tấn công XSS. Vì vậy, hãy thật cẩn thận khi sử dụng cú pháp thoát, đặc biệt nếu người dùng trong ứng dụng của bạn đang tự cung cấp HTML, họ có thể tự tiêm mã theo ý mình.


2

Nếu bạn muốn thoát khỏi việc sử dụng dữ liệu

{{ $html }}

Nếu không muốn thoát khỏi việc sử dụng dữ liệu

{!! $html !!}

Nhưng cho đến khi Laravel-4 bạn có thể sử dụng

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

Khi đến với Laravel-5

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

Bạn cũng có thể làm điều này với chức năng PHP

{{ html_entity_decode($data) }}

xem qua tài liệu PHP để biết các tham số của hàm này

html_entity_decode - php.net


2

Điều này hoạt động tốt cho Laravel 5.6

<?php echo "$text"; ?>

Theo một cách khác

{!! $text !!}

Nó sẽ không hiển thị mã HTML và in dưới dạng chuỗi.

Để biết thêm chi tiết liên kết mở: - Hiển thị HTML bằng Blade


1

Đối với những người sử dụng tinymce và đánh dấu trong textarea:

{{ htmlspecialchars($text) }}

0

Tôi đã ở đó và đó là lỗi của tôi. Và rất ngu ngốc.

nếu bạn quên phần mở rộng .blade trong tên tệp, tệp đó không hiểu về lưỡi nhưng chạy mã php. Bạn nên sử dụng

/resources/views/filename.blade.php

thay vì

/resources/views/filename.php

hy vọng điều này sẽ giúp được ai đó



0

Nếu bạn sử dụng lớp Bootstrap sụp đổ đôi khi {!! $text !!} không hiệu quả với tôi nhưng lại {{ html_entity_decode($text) }}hiệu quả với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.