2015-11-13 87 views
0

嘗試確定如何從Ruby中的字符串去除HTML標記。在我看到視圖之前,我需要在模型中完成此操作。所以使用:如何在模型中去除模型中的字符串的HTML標記

ActionView::Helpers::SanitizeHelperstrip_tags() 

將無法​​正常工作。我正在研究使用Nokogiri,但無法弄清楚如何去做。

如果我有一個字符串:

description = <a href="http://google.com">google</a> 

我需要它轉換爲純文本,而不包括HTML標籤,以便將剛出來爲「谷歌」。

現在我有這將需要HTML實體注意以下:

def simple_description 
    simple_description = Nokogiri::HTML.parse(self.description) 
    simple_description.text 
end 

回答

1

您可以直接撥打消毒這樣的:

Rails::Html::FullSanitizer.new.sanitize('<b>bold</b>') 
# => "bold" 

也有其他消毒劑類,可能是有用的:FullSanitizer,LinkSanitizer,Sanitizer,WhiteListSanitizer。

+0

將它添加到我的代碼從軌道獲取以下錯誤: '未初始化的常量Rails :: HTML' –

+0

只需添加'raw' helper,因此它看起來像這樣'raw(Rails :: Html :: FullSanitizer.new .sanitize('bold'))'。這對我有用 –

0

也許你可以使用正則表達式的紅寶石一樣以下

des = '<a href="http://google.com">google</a>' 
p des[/<.*>(.*)\<\/.*>/,1] 

其結果將是「谷歌」

正則表達式是強大的。

您可以自定義以滿足您的需求。

+0

[不要使用正則表達式來解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags?lq=1 )。該技巧從不適用於任何類似於真實世界的HTML。這個問題涉及到爲什麼,爲什麼不,並且是網站上最受歡迎的問題之一。考慮你的模式的行爲,如果文本包含'>'。 –

0

引入nokogiri是,如果你沒有自己的HTML生成一個偉大的選擇,你想降低您的維護工作量:

require 'nokogiri' 
description = '<a href="http://google.com">google</a>' 
Nokogiri::HTML::DocumentFragment.parse(description).at('a').text 
# => "google" 

約解析器與使用模式的好處,是解析器繼續工作隨着文檔的標籤或格式的變化,而模式會被這些東西絆倒。

雖然使用解析器的速度稍慢,但通過易用性和減少的維護,它的作用不僅僅是彌補了這一點。

上面休息的代碼到:

Nokogiri::HTML(description).to_html 
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><a href=\"http://google.com\">google</a></body></html>\n" 

與其讓引入nokogiri添加普通的HTML頭,我告訴它只有一個節點解析爲文檔片段:

Nokogiri::HTML::DocumentFragment.parse(description).to_html 
# => "<a href=\"http://google.com\">google</a>" 

at發現該節點的第一次出現:

Nokogiri::HTML::DocumentFragment.parse(description).at('a').to_html 
# => "<a href=\"http://google.com\">google</a>" 

text在節點中找到文本。

相關問題