Laravel 5 : 블레이드를 사용하여 HTML 표시


283

다음과 같이 내보기 중 하나에 문자열이 반환되었습니다.

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

Blade로 표시하려고합니다.

{{$text}}

그러나 출력은 렌더링 된 HTML 대신 원시 문자열입니다. Laravel 5에서 블레이드로 HTML을 표시하려면 어떻게합니까?

추신. PHP echo()가 HTML을 올바르게 표시합니다.


2
{!! nl2br($post->description) !!}공백과 br 만 있으면 나를 위해 일합니다.
무하마드 샤 자드

답변:


652

당신은 사용해야합니다

{!! $text !!}

사용하면 문자열이 자동 이스케이프됩니다 {{ $text }}.


5
"데이터를 이스케이프하지 않으려면 다음 구문을 사용할 수 있습니다. Hello, {!! $name !!}." laravel.com/docs/5.5/blade#displaying-data
Ryan

1
@Ryan이 언급 한 것에 대해서도 궁금합니다. 이것이 보안 문제가 아닙니까?
샌더

@sanders $text사용자 입력 이 포함되어 있고 올바르게 이스케이프하지 않으면 보안 문제 일 가능성이 큽니다 . 예를 들어 HTML을 포함하여 XSS를 허용 할 수 $text = 'Hello <b>'.$_GET['name'].'</b>';있으므로 위험 $_GET['name']합니다. 당신은 할 $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
이것은 옳지 않다. 그것은 답변을 혼란스럽게 할 수있는 해답
Milad

8

당신이 사용할 수있는 {!! Laravel에서 HTML 코드를 렌더링하기위한 $ text !!}

{!! $text !!}

당신이 사용하는 경우

{{ $text }}

HTML 코드를 렌더링하지 않고 문자열로 인쇄합니다.


5

{!! $text !!}데이터를 이스케이프하지 않고 표시하는 데 사용 합니다. 사용자가 제공 한 데이터는 정리하지 않은 상태에서이 작업을 수행하지 마십시오.



5

라 라벨 5에서 ​​여러 가지 방법으로 할 수 있습니다.

{!! $text !!}

{!! html_entity_decode($text) !!}

위의 db에 인코딩 된 태그 (<p >> hello world./p>)를 저장하면 코드가 작동합니다 ... 감사합니다 !!!
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()하려면 이스케이프 구문 블레이드가 제공 하는 기능을 이스케이프 처리합니다.

{!! $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')) }}

라 라벨 -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



1

텍스트 영역 내에서 tinymce 및 마크 업을 사용하는 사람 :

{{ htmlspecialchars($text) }}

0

나는 거기에 있었고 내 잘못이었다. 그리고 매우 멍청한 것.

파일 이름에서 .blade 확장자를 잊어 버린 경우 해당 파일은 블레이드를 이해하지 못하지만 PHP 코드를 실행합니다. 사용해야합니다

/resources/views/filename.blade.php

대신에

/resources/views/filename.php

이것이 도움이되기를 바랍니다.


0

이것을 시도하십시오, 효과가 있습니다 :

@php 
   echo $text; 
@endphp

0

Bootstrap Collapse 클래스를 사용하면 때로는 {!! $text !!} 저에게 효과적이지 않지만 {{ html_entity_decode($text) }}저에게 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.