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

では、textarea「u'1 \ r \ n2 \ r \ n \ r \ n3 \ r \ n4'」としてDBに保存され、|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は、最初は単一の行区切りとして一致しますが、そのうちの 2 つに一致する必要があるため、バックトラックして、\rその後に\n. 否定先読み は、次の文字が である場合に単独で(?!\n)一致することを防ぎます。\r\n

于 2012-09-20T22:00:06.047 に答える