从rails中的属性中删除所有html标记

时间:2010-04-05 00:17:04

标签: ruby-on-rails regex

我有一个Project模型,它有一些文本属性,一个是摘要。我有一些项目在摘要中有html标签,我想将其转换为纯文本。我有这个方法有一个将删除所有HTML标签的正则表达式。

def strip_html_comments_on_data
  self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")}
end

我还有一个before_save过滤器

before_save :strip_html_comments_on_data

问题是保存项目后html标签仍然存在。我错过了什么?

并且,有一种非常简单的方法可以在所有模型中调用该方法吗?

谢谢,

NicolásHockIsaza

6 个答案:

答案 0 :(得分:45)

未测试

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = sanitize(html_input)
end

其中html_input是包含HTML标记的字符串。

修改

您可以通过传递:tags=>[]作为选项来删除所有代码:

plain_text = sanitize(html_input, :tags=>[])

虽然阅读docs我看到有更好的方法:

plain_text = strip_tags(html_input)

然后按照smotchkiss将其变为前置过滤器,你就可以了。

答案 1 :(得分:10)

最好不要在模型中包含视图助手。只需使用:

HTML::FullSanitizer.new.sanitize(text)

答案 2 :(得分:3)

只需使用zetetic

中提到的strip_tags()文本助手

答案 3 :(得分:1)

首先,这里的问题是Array#each返回输入数组而不管块内容如何。在我问的一个问题中,有几个人和我一起过Array#each"Return hash with modified values in Ruby"

其次,除了Array#each并没有真正做到你想要的东西,我认为你不应该这样做。为什么需要在 ALL 模型的属性上运行此方法?

最后,为什么不保留用户的HTML输入,只是在输出时使用标准h()助手?

# this will output as plain text
<%=h string_with_html %>

这很有用,因为您可以查看数据库并查看与用户输入的完全相同的未修改数据(如果需要)。如果你真的必须在保存值之前转换为纯文本,@ zetetic的解决方案可以让你开始。

include ActionView::Helpers::SanitizeHelper

class Comment < ActiveRecord::Base

  before_save :sanitize_html

  protected
  def sanitize_html
    self.text = sanitize(text)
  end

end

答案 4 :(得分:1)

直接参考Rails'消毒剂,不使用包含。

def text
  ActionView::Base.full_sanitizer.sanitize(html).html_safe
end

注意:我附加.html_safe以使&nbsp;等HTML实体正确呈现。如果可能存在恶意JavaScript注入,请不要使用此功能。

答案 5 :(得分:0)

如果你想删除&nbsp;和html标签,可以使用nokogiri

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = strip_tags(html_input)
  Nokogiri::HTML.fragment(sanitized_output)
end