【问题标题】:Is there a better way to apply a nl2br filter with Jinja/Flask?有没有更好的方法来使用 Jinja/Flask 应用 nl2br 过滤器?
【发布时间】:2012-09-20 21:22:49
【问题描述】:

我正在使用 Jinja 和 Flask(启用自动转义),我正在尝试应用 this filter

import re

from jinja2 import evalcontextfilter, Markup, escape

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

app = Flask(__name__)

@app.template_filter()
@evalcontextfilter
def nl2br(eval_ctx, value):
    result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n') \
        for p in _paragraph_re.split(escape(value)))
    if eval_ctx.autoescape:
        result = Markup(result)
    return result

它的问题是它从不应用&lt;br&gt;s 并且总是在每一行周围应用&lt;p&gt;s。

如果我输入:

1
2

3
4

textarea 中,它以“u'1\r\n2\r\n\r\n3\r\n4'”的形式保存到数据库中,并且在使用 |nl2br 过滤器放入 Jinja 时出来

<p>1</p>

<p>2</p>

<p>3</p>

<p>4</p>

我正在寻找它

<p>1<br>2</p>
<p>3<br>4</p>

这种正则表达式方法对于我所追求的来说似乎有点过头了。

请告诉我有一种更简单的方法可以完成此任务,因为我整天都在努力解决这个问题...

【问题讨论】:

标签: python regex flask template-engine jinja2


【解决方案1】:

不简单,但稍微复杂一点怎么样?试试这个正则表达式:

(?:\r\n|\r(?!\n)|\n){2,}

最初的正则表达式匹配\r\n作为单行分隔符,但它需要匹配其中两个,所以它回溯并匹配它为\r,然后是\n。如果下一个字符是 \n,则负前瞻 (?!\n) 会阻止它单独匹配 \r

【讨论】:

  • 这是一个很好的解释和一个很好的修复,但是您错过了一个通过将您的修复贡献回官方文档来为世界做更多好事的机会,官方文档(在撰写此评论时) ) 仍然使用来自jinja.pocoo.org/docs/2.10/api/#custom-filters 问题的损坏的正则表达式。我在github.com/pallets/jinja/pull/929 的官方文档(感谢您)的补丁中提出了您的修复方案;我希望你批准!
  • 我早该想到的。谢谢,马克。
猜你喜欢
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多