2012-09-20 67 views
0

可能重複:
Why is this Jinja nl2br filter escaping <br>'s but not <p>'s?有沒有更好的方法來應用帶有Jinja/Flask的nl2br過濾器?

我使用的是神社與瓶(啓用autoescape),我嘗試應用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

,它就會被保存到DB爲 「U'\ r \ N2 \ r \ n \ r \ N3 \ r \ N4' 」,當把與神社| nl2br過濾它出來作爲

<p>1</p> 

<p>2</p> 

<p>3</p> 

<p>4</p> 

我找它是

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

這個正則表達式的方法似乎是大材小用我後。請告訴我他們是一個更簡單的方法來實現這一點,因爲我一直拉着我的頭髮整天試圖找出它...

回答

6

更簡單不,但稍微複雜一點呢?與此正則表達式嘗試:

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

原正則表達式匹配\r\n爲單條線分隔在第一,但它需要匹配他們兩個,所以它回溯和它匹配的\r其次\n。如果下一個字符是\n,則負面預測(?!\n)將阻止其單獨匹配\r

相關問題