有没有更好的方法来应用与Jinja / Flask的nl2br过滤器?

时间:2012-09-20 21:22:50

标签: python regex flask template-engine jinja2

我正在使用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

问题在于它永远不会应用<br>并始终在每一行周围应用<p>

如果我输入:

1
2

3
4

textarea中,它将被保存到数据库中,作为“u'1 \ r \ n \ n \ n \ n \ r \ n \ n \ n \ n \ n \ n \ r \ n \ n \ n \ n \ n'\ n''”并且在{{1过滤它出来

|nl2br

我正在寻找它

<p>1</p>

<p>2</p>

<p>3</p>

<p>4</p>

这种正则表达式方法对我所追求的东西来说似乎有些过分。

请告诉我有一种更简单的方法可以实现这一目标,因为我一整天都在试着把头发拉出来......

1 个答案:

答案 0 :(得分:7)

更简单没有,但如何稍微复杂一点?试试这个正则表达式:

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

原始正则表达式首先将\r\n与单行分隔符匹配,但需要匹配其中两个,因此它会回溯并将其匹配为\r,后跟\n。如果下一个字符为(?!\n),则否定前瞻\r会阻止其单独匹配\n