如何保持用户输入的换行符,还要清除刀片中的消毒?

wil*_*Liu 8 laravel-4

我尝试从我的数据库中保存的用户textarea输入中呈现数据.

我需要保持换行使用nl2br,

并且还希望通过使用刀片{{{}}}来防范恶意脚本.

但是{{{nl2br($ output)}}}不会工作,br标签也会被消毒.

请给我一些提示,谢谢.

Saw*_*wny 25

对于Laravel 4用户:

{{ nl2br(e($message)) }}
Run Code Online (Sandbox Code Playgroud)

e($x)相当于{{{ $x }}}.

Laravel 5用户:

{!! nl2br(e($message)) !!}
Run Code Online (Sandbox Code Playgroud)

e($x)相当于{{ $x }}.

  • 我不得不像这样使用{!! nl2br(e($ message))!!} (2认同)

ash*_*exm 7

Sawny的答案非常好,它可以很好地利用Blade语法的强大功能,除了我会更进一步.您可以使用Blade::extend创建自己的Blade @短代码,因此我使用以下内容:

Blade::extend(function($value, $compiler)
{
    $pattern = $compiler->createMatcher('nlbr');
    return preg_replace($pattern, '$1<?php echo nl2br(e($2)); ?>', $value);
});
Run Code Online (Sandbox Code Playgroud)

现在,在您的Blade模板中,所有必须做的事情都是这样的:

<div>@nlbr($sometext)</div>
Run Code Online (Sandbox Code Playgroud)

编辑:我意识到有人遇到这个可能很好奇,"我在哪里放这个Blade::extend功能?"

说实话,它可以进入很多地方(这取决于你是否使用Laravel 4或5作为'最佳'方法).

一个简单的地方,把它在routes.phpglobal.php文件,因为它们将得到回升用最少的努力.然而,这些并不是最好的文件,你最好学习创建Laravel提供商.