【问题标题】:How to escape strings in Laravel 5.4 Markdown mails?如何在 Laravel 5.4 Markdown 邮件中转义字符串?
【发布时间】:2017-06-22 16:59:23
【问题描述】:

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

这是我的邮件刀片模板:

# Message for you!

Hello {{ $user->name }},

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

Greetings

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

更新:

您可以使用 \ (https://meta.stackexchange.com/a/198231) 转义所有降价字符

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

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

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

如何转义字符串?

问候

【问题讨论】:

标签: laravel laravel-blade laravel-5.4


【解决方案1】:

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

首先,您必须使用 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 :)

【讨论】:

    【解决方案2】:

    我认为不可能逃脱刀片中的第一个字符。

    解决此问题的一种可能方法是将“#”更改为 html 编号 &amp;#35;

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

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

    我认为这应该可行。

    更新

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

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

    【讨论】:

    • 好的,谢谢,这是一个简单的解决方案,但我必须在字符串的任何位置转义所有降价字符。我认为有一个函数或刀片语法可以避免解析 markdown 字符。
    • 我更新了答案。我想这就是你需要的。
    猜你喜欢
    • 2017-06-28
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多