在进入视图之前,如何从模型中的字符串中剥离HTML标记

时间:2015-11-13 18:14:59

标签: html ruby-on-rails ruby nokogiri

尝试确定如何从Ruby中的字符串中剥离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

3 个答案:

答案 0 :(得分:1)

你可以像这样直接打电话给消毒剂:

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

还有其他可能有用的消毒剂类:FullSanitizer,LinkSanitizer,Sanitizer,WhiteListSanitizer。

答案 1 :(得分:1)

如果您不拥有HTML生成器并希望减少维护负担,那么Nokogiri是一个很好的选择:

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

答案 2 :(得分:-1)

也许你可以在ruby中使用正则表达式,如下面的

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

结果将是&#34; google&#34;

正则表达很强大。

您可以自定义以满足您的需求。