如何转义 Laravel 5.4 Markdown 邮件中的字符串?

How to escape strings in Laravel 5.4 Markdown mails?

Laravel 5.4 有一个新功能。您可以在邮件模板中使用 Markdown。

这是我的邮件 blade 模板:

# Message for you!

Hello {{ $user->name }},

@foreach($messages as $message)
{{ $message->text }}
@endforeach

Greetings

我的问题是:$message->text的第一个字符可以是#数字符号或散列),所以字符串被解析为标题...

更新:

您可以使用 \ (https://meta.stackexchange.com/a/198231)

转义所有降价字符

我尝试使用此代码转义所有字符:

$text = str_replace(
    ['\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '#', '+', '-', '.', '!'],
    ['\\', '\`', '\*', '\_', '\{', '\}', '\[', '\]', '\(', '\)', '\#', '\+', '\-', '\.', '\!'],
    $text
);

但我认为这不是推荐的方式...

如何转义字符串?

问候

我认为无法转义 blade 中的第一个字符。

解决此问题的一种可能方法是将“#”更改为 html 数字 #

在您的控制器中,您可以检查消息是否以 # 开头并将其替换为 #

function replaceFirstChar($message)
{
    if ($message[0] == "#") {
        $new_message = '&#35' . substr($message, 1);
        return $new_message;
    } else {
        return $message;
    }
}

我认为这应该可行。

更新

addcslashes($str , '\ `*[]()#+-.!');

这应该可以解决问题。 (可能需要添加一些额外的字符)

好的,我找到了我的解决方案!您必须创建一个新的邮件组件...

首先,您必须使用 php artisan vendor:publish --tag=laravel-mail (https://laravel.com/docs/5.4/mail#customizing-the-components) 从 laravel 发布电子邮件组件。现在您的 resources/views.

中有一个 vendor 文件夹

进入 resources/views/mail/html 并创建一个新的 .blade.php 文件。我的文件如下所示:

<table class="notification" align="center" width="100%" cellpadding="0" cellspacing="0">
    <tr>
        <td class="notification-meta">
            {{ $time }}
        </td>
    </tr>
    <tr>
        <td class="notification-content">
            {{ $slot }}
        </td>
    </tr>
</table>

您必须在 resources/views/markdown/html 下为纯文本邮件创建相同的文件。

如果您查看 resources/views/mail/html/footer.blade.php,您可以在模板中看到以下函数:

{{ Illuminate\Mail\Markdown::parse($slot) }}

此函数将 markdown 解析为 html。我没有在我的模板中使用该功能。

现在我可以在邮件中使用我的组件了:

# Message for you!

Hello {{ $user->name }},

@component('mail::notification', ['time' => '06.02.2017' ])
{{ $text }}
@endcomponent

Greetings

并且 $text 不会从 markdown 解析为 html :)