0

我正在使用带有 Flask 的 Jinja(启用自动转义)并且我正在尝试应用此过滤器

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>s 并且总是<p>在每一行周围应用 s。

如果我输入:

1
2

3
4

在 a 中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>

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

请告诉我有一种更简单的方法可以实现这一点,因为我整天都在拉头发试图弄清楚......

4

1 回答 1

7

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

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

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

于 2012-09-20T22:00:06.047 回答