2012-01-26 134 views
1

我有一個數據庫充滿了舊博客文章,我試圖遷移到Rails。身體字段由職位,看有沒有類似這樣的格式:在Rails 3中渲染安全的html

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. 

<iframe src="http://www.youtube.com?v=XXXXXXXX" width="400" height="250"></iframe> 

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. 

<ul> 
<li>List item</li> 
<li>List item</li> 
<li>List item</li> 
<li>List item</li> 
</ul> 

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. 

所以我想要做的是包裹在<p>段落文本,但先不談其他HTML元素。以下是我已經試過:

simple_format(@ post.body) =這使周圍的一切<p>,又污染我的無序列表,每個列表項之間的休息時間。此外,iframe嵌入不會顯示。

原料(@ post.body)@ post.body.html_safe =的iframe嵌入和無序列表顯示了巨大的,但一切都運行起來,因爲有新的線路沒有替換。

simple_format(@ post.body,{},{:sanitize => false}) =酷。現在我可以看到所有的html標籤了!在所有

@ post.body.gsub不起作用(/ \ r \ n?/ 「<br/>」).html_safe =同樣的問題與simple_format ......我越來越換行符在我html塊元素標籤。

有關如何完成此任務的任何建議?

+0

注意!在unsanitized,不受信任的字符串*上調用'html_safe' *會讓你開放給XSS攻擊。如果你在某個地方調用'html_safe',你必須絕對確定該字符串不包含不可信用戶輸入。 – Ajedi32

回答

2

我想你幾乎擁有了在你的最後一個例子,但我的猜測是,你需要做的.html_safe早些時候:

@post.body.html_safe.gsub(/\r\n?/,"<br/>") 
+0

不完全。 gsub將它變成一個字符串,其中所有的html在渲染時都可見。 – bjork24

+1

匆匆一瞥,我認爲這將需要'html_safe'再次。試試'@ post.body.html_safe.gsub(/ \ r \ n?/,「
」).html_safe'。 gsub的結果默認情況下會成爲一個消毒過的字符串。 –

1

我認爲你的問題有少做軌道比試圖修復破壞的HTML。在任何情況下,您的示例都建議應該包裝在<p>標記中的文本是尚未以標記開頭的行。只有你知道這條規則是否適用於其他職位。

試試這個。它也佔領先的空白。

raw(@post.body.gsub(/^\s*[^<].*/, '<p>\&</p>')) 

如果上述過於脆弱,我建議使用Nokogiri。這需要文本的每個頂級連續塊並把它封裝在<p>

doc = Nokogiri.XML("<body>\n" + @post.body + "\n</body>\n") 
doc.root.children.each{|c| c.text? and c.replace("<p>#{c.to_s.strip}</p>") } 
raw(doc.root.inner_html) 

要在文本塊的換行符插入<br> S,則可以如上文c.to_s.strip.gsub(/\r?\n/, "<br/>\n")替換c.to_s.strip

我注意到你的問題有/\r\n?/。你是否期望自己的舊Mac OS回車(\r)?如果你想要處理Windows或Unix,你應該使用/\r?\n/

1

我覺得sanitize也許你想要什麼

%= sanitize @article.body %> 


def sanitize(html, options = {}) 
    self.class.white_list_sanitizer.sanitize(html, options).try(:html_safe) 
end