如何在常规 Ruby 代码(非 Rails)中使用 strip_tags?

Posted

技术标签:

【中文标题】如何在常规 Ruby 代码(非 Rails)中使用 strip_tags?【英文标题】:How can I use strip_tags in regular Ruby code (non-rails)? 【发布时间】:2011-05-20 05:41:54 【问题描述】:

我需要将 html 转换为纯文本。 ActionView 的 SanitizeHelper 中有一个很好的功能,但我无法理解如何引用它并在简单的 test.rb 文件中使用它。

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

我希望能够致电strip_tags("<b>lol</b>") => "lol"

【问题讨论】:

【参考方案1】:

这个问题很老了,但你可以在你的test.rb 中这样称呼它:

ActionController::Base.helpers.strip_tags("<b>lol</b>") => "lol"

【讨论】:

【参考方案2】:

用这个例子:

"&lt;p&gt;<i>example</i>&lt;/p&gt;"

这对我有帮助:

ActionView::Base.full_sanitizer.sanitize(Nokogiri::HTML(example).text)

输出:

example

【讨论】:

结合这两个选项终于对我有用了! @ManoloPirolo 好!)【参考方案3】:

如果你不经常使用它,那么你可以使用:

ActionView::Base.full_sanitizer.sanitize(your_html_string)

否则您可以在 test_helper.rb 文件中定义一个方法,例如:

def strip_html_tags(string)
    ActionView::Base.full_sanitizer.sanitize(string)
end

然后在你的 test.rb 文件中,像这样使用:

strip_html_tags(your_html_string)

【讨论】:

【参考方案4】:
HTML::FullSanitizer.new.sanitize('<b>lol</b>') # => "lol"

【讨论】:

【参考方案5】:

ActiveSupport 是唯一支持挑选单个组件的 Rails 框架。其他框架,包括 ActionView,必须是整体必需的:

require 'action_view'

请注意,这并不一定会加载所有 ActionView。除非线程安全要求自动加载急切地发生,它只是设置自动加载并需要公共依赖项。这意味着遵循要求,如果您引用,例如ActionView::Helpers::SanitizeHelper,这将导致需要action_view/helpers /sanitize_helper.rb

因此,使用 ActionView 完成您所期望的正确、受支持的方法如下:

require 'action_view'

class Test < Test::Unit::TestCase # or whatever
  include ActionView::Helpers::SanitizeHelper

  def my_test
    assert_equal "lol", strip_tags("<b>lol</b>")
  end
end

这没有很好的记录;我这个答案主要基于the discussion on this issue。

【讨论】:

你需要明确要求action_view吗?在哪个 Rails 版本中?我不记得至少需要 Rails 2.3.x 问题是关于在 Rails outside 中使用 strip_tags,所以,是的,您确实需要包含它。 哦,我明白了,确实 OP 并没有说他正在使用 Rails。【参考方案6】:

这个问题很老了,但我最近遇到了同样的问题。我找到了一个简单的解决方案:gem sanitize。它很轻,工作正常,并且如果您需要它们还有其他选项。

Sanitize.clean("<b>lol</b>") #=> "lol"

【讨论】:

【参考方案7】:

理想情况下,您需要并包含ActionView::Helpers::SanitizeHelper,但是当您这样做时,有几个依赖项不会被包含在内。您可以自己要求他们能够使用strip_tags

require 'erb'
require 'active_support'
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/string/encoding'
require 'action_view/helpers/capture_helper'
require 'action_view/helpers/sanitize_helper'

include ActionView::Helpers::SanitizeHelper

strip_tags("<b>lol</b>") # => "lol"

这是假设您安装了 rails 3 gems。

【讨论】:

ActionView 不支持挑选樱桃的要求——这就是为什么这种方法最终如此糟糕的原因。有关详细信息,请参阅我的答案。【参考方案8】:

我相信这应该足够了:

"<b>lol</b>".gsub(/<[^>]*>/ui,'') #=> lol

您也可以使用 Nokogiri:

require 'rubygems'
require 'nokogiri'
doc = Nokogiri::HTML("<b>lol</b>")
doc.text #=> "lol"

您仍然可以通过以下方式使用 Rails:

require 'rubygems'
require 'action_view'

class Foo
  include ActionView::Helpers::SanitizeHelper

  def test
    strip_tags("<b>lol</b>")
  end
end

f = Foo.new
puts f.test #=> lol

【讨论】:

你永远不知道浏览器会做什么,如果你只是放一个左括号而不关闭它;我绝对不会认为gsub 解决方案是安全的,除非您在最后添加一个额外的.gsub(/[&lt;&gt;]/, '')。 (即使那样我也不会担保。) Nokogiri 评论 +1。这非常适合我的需求。 值得一提,nokogiri 是一个巨大的库,通常从源代码编译...可能有点矫枉过正,使用整个解析库来实现这一点,当 Rails 附带大量的技巧时盒子。 不要自己编写消毒剂。他们总是会在某些极端情况下失败,然后就会出现欢闹(即黑客攻击)!使用适当的库。

以上是关于如何在常规 Ruby 代码(非 Rails)中使用 strip_tags?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:如何使用迁移向现有列添加非空约束?

Ruby on Rails 中的 Runner

如何在一个简单的非 Rails 项目中使用特定的 Ruby 版本

在 Ruby on Rails 中自动增加非主键字段

如何注销 Facebook - 在 Rails 应用程序中使用代码(Ruby on Rails Omniauth)

Rails:如何小写非英文字符串?