【问题标题】:How can I use strip_tags in regular Ruby code (non-rails)?如何在常规 Ruby 代码(非 Rails)中使用 strip_tags?
【发布时间】: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"

【问题讨论】:

    标签: html ruby tags strip actionview


    【解决方案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 附带大量的技巧时盒子。
            • 不要自己编写消毒剂。他们总是会在某些极端情况下失败,然后就会出现欢闹(即黑客攻击)!使用适当的库。
            猜你喜欢
            • 2021-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-16
            相关资源
            最近更新 更多