2015-11-13 88 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在节点中找到文本。

相关问题