25

假设我有:

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

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

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

第一个可以使用html_safe

@string.html_safe

它是一个字符串

我怎样才能实现第二个?

它是一个字符串。

4

7 回答 7

53

你可以试试这个:

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

strip_tags(html)

于 2013-03-06T15:53:24.607 回答
9

你可以试试这个:

strip_tags(@string)
于 2016-07-18T09:12:10.430 回答
5

用于一般用途(例如网络刮板):

puts Rails::Html::FullSanitizer.new.sanitize("<div>Hello</div><br>")
# Hello
于 2017-03-22T11:05:14.017 回答
2

你可以用nokogiri它来做同样的事情。

这篇SO 帖子讲述了这个故事。

简而言之:

这使用了 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
于 2013-03-06T16:00:07.637 回答
1

在 Rails 中,另请参见 strip_tags 方法。http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-strip_tags

于 2015-03-19T19:17:06.620 回答
0

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

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

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

所以你可以使用:

@string.strip_links
于 2013-03-06T15:54:17.147 回答
0

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

 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
于 2021-12-17T02:23:05.877 回答