【问题标题】:How to remove HTML markup from string如何从字符串中删除 HTML 标记
【发布时间】:2013-02-21 12:05:12
【问题描述】:

假设我有:

@string = "it is a <a href="#">string</a>"

我想以两种方式在我的应用程序的不同部分使用它:

  • 带有可点击的链接
  • 没有可点击的链接(但不显示任何 HTML 标记)

第一个可以使用html_safe:

@string.html_safe

这是一个string

我怎样才能实现第二个?

这是一个字符串。

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 html-safe


【解决方案1】:

你可以试试这个:

ActionView::Base.full_sanitizer.sanitize(@string)

strip_tags(html)

【讨论】:

    【解决方案2】:

    你可以试试这个:

    strip_tags(@string)
    

    【讨论】:

      【解决方案3】:

      用于一般用途(例如网络爬虫):

      puts Rails::Html::FullSanitizer.new.sanitize("<div>Hello</div><br>")
      # Hello
      

      【讨论】:

        【解决方案4】:

        您可以使用nokogiri 来做同样的事情。

        SO post 讲述了这个故事。

        简而言之:

        这使用了 XPath 的 starts-with 函数:

        你必须先这样定义它:

        require 'nokogiri'
        
        item = Nokogiri::HTML('<a href="#">string</a>')
        puts item.to_html
        

        上面将给出 html 输出。然后你可以使用 XPath。

        item.search('//a[not(starts-with(@href, "http://"))]').each do |a|
          a.replace(a.content)
        end
        puts item.to_html
        

        【讨论】:

          【解决方案5】:

          【讨论】:

            【解决方案6】:

            Rails 提供了一个名为strip_links 的方法,它似乎可以做你想做的事(看它的名字)。

            根据its APIDock page 有点受限。要使其适用于/任何字符串,您可以扩展字符串类:

            class String
              def strip_links
                ActionController::Base.helpers.strip_links(self)
              end
            end
            

            所以你可以使用:

            @string.strip_links
            

            【讨论】:

            • 如果字符串没有 html 标记,strip_links 会给出错误。扩展该方法不会产生错误,但不适用于某些标记,例如 。不过还是谢谢。
            • 哦...我认为/假设您的字符串中总是有一个链接...我猜sanitize method 删除了所有 HTML...(它在同一个 Helper 模块中)跨度>
            【解决方案7】:

            受楼上的启发,我在我的项目中定义了这个函数

             def delete_html_markup(data)
                return data if data.blank?
                if data.is_a?(Array)
                  data.map{ | s |  delete_html_markup(s)  }
                elsif data.is_a?(Hash)
                  data.each do | k, v |
                    data[k] = delete_html_markup(v)
                  end
                else
                  ActionView::Base.full_sanitizer.sanitize(data)
                end
              end
            

            【讨论】:

            猜你喜欢
            • 2010-09-19
            • 2017-09-06
            • 1970-01-01
            • 2011-04-15
            相关资源
            最近更新 更多