【问题标题】:Jade - convert new lines to <br/> and keep the content encodedJade - 将新行转换为 <br/> 并保持内容编码
【发布时间】:2013-01-10 12:53:47
【问题描述】:

我对 Jade 模板引擎还不是很熟悉。有没有办法将 \n 等新行转换为 br 标签,同时保持其他内容编码?

例如

.replace(/\n/g,'</br>')

应用于编码值应该可以完成工作。但是我不确定如何对值进行编码并获得结果。有什么帮手吗?

【问题讨论】:

    标签: node.js pug


    【解决方案1】:

    您可以使用翡翠转义方法并像这样替换返回值中的换行符:

    p !{escape(foo).replace(/\n/g, '<br/>')}
    

    我不知道您的用例有任何内置功能。


    看起来 pug 摆脱了转义功能,所以这就是你现在必须使用的:

    p !{foo.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br/>')}
    

    【讨论】:

    • 这就是我要说的!谢谢老兄。
    • 这不是杰德的方法。由于模板编译成 JS 函数,你可以在其中使用任何 node 和 V8 全局变量。
    • 虽然您确实可以使用全局方法,但这不是全局转义方法。全局转义方法将为每个&amp;lt; 返回%3C,而不是像翡翠转义方法那样返回&amp;lt;
    • @dave 抱歉,不知道这一点。谢谢。
    • 尝试在我的模板中格式化 pug 错误消息,.message !{message.replace(/\n/g, '&lt;br/&gt;')} 就足够了。
    【解决方案2】:

    如果您并不完全需要&lt;br&gt;,您可以简单地将您的文本放在&lt;pre&gt; 标记中。所有空格(包括新行)都将显示为已键入。

    或者您可以设置 css 规则 white-space: pre 以保留空白预格式化。检查MDN

    【讨论】:

    • 将此与word-wrap: break-word;结合使用
    • 如果没有可接受的点,word-wrap: break-word 在任意点拆分单词。如果您只想要简单的文本格式,并在下一行换行,请尝试white-space: pre-wrap
    • 我认为在这种情况下最好使用white-space: pre-line
    【解决方案3】:

    转义方法,甚至将简单的空格('')字符转换为“%20”。

    MDN says escape is deprecated 用于编码 url 中的字符串,而不是 html 内容。 另一种解决方案,

    each line in foo.split(/\n/)
      = line
      br
    

    【讨论】:

    • 很遗憾,这将留下一个尾随换行符。
    【解决方案4】:

    大多数答案说你需要做p !{foo.replace(/\n/g)}。然而,这还不够:正则表达式中的\n 匹配换行符,因此您需要转义\n 中的\。您可以通过将额外的\ 添加到\n 来做到这一点。

    最终结果:

    p !{foo.replace(/\\n/g, '<br />')}
    

    注意:如果您也想转义其他字符,只需添加:
    .replace(/&amp;/g, '&amp;amp;').replace(/&lt;/g, '&amp;lt;').replace(/&gt;/g, '&amp;gt;')

    编辑:
    您可以使用 p #{foo.replace...} 正确转义 html 标签中的所有字符。如果您想防止用户在输入字段中插入 &lt;script&gt;...&lt;/script&gt; 标记来入侵您的网站,这将非常有用。

    【讨论】:

      【解决方案5】:

      考虑你是否真的想要&lt;br&gt; 标签。

      如果你可以改用 CSS

      最好使用white-space: pre-line。查看MDN page,上面写着

      pre-line

      空白序列被折叠。在换行符、&lt;br&gt; 处换行,并根据需要填充行框。

      这与正常行为相同,只是换行符变成换行符。

      这应该做你想做的。

      如果你想要&lt;br&gt;标签

      此处给出&lt;br&gt; 标签的所有现有答案要么不转义HTML 的输出(这可能很危险),要么重新实现转义逻辑,要么留下一个尾随换行符。

      这个基于Palani's answer,但不留下尾随换行符,并且还可以防止foo 无效或为假。

      each line in (foo || '').split('\n').slice(0, -1)
        = line
        br
      = (foo || '').split('\n').pop()
      

      我不喜欢这个解决方案,但如果你想要&lt;br&gt; 标签,我认为它比其他解决方案更可取。

      如果您可能要通过它输入大字符串,最好为split 的结果创建一个临时变量,这样就不会重复执行两次。

      【讨论】:

        【解决方案6】:

        你可以这么简单:

        p !{someString.replace(/\n/g, '<br/>')}
        

        请注意,此方法将正确转义字符串。

        【讨论】:

        • 它不是转义 someString 变量,现在它可以渲染丰富的 html 内容,例如 xss :(
        猜你喜欢
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多