假设我有:
@string = "it is a <a href="#">string</a>"
我想以两种方式在我的应用程序的不同部分使用它:
- 带有可点击的链接
- 没有可点击链接(但不显示任何 HTML 标记)
第一个可以使用html_safe
:
@string.html_safe
它是一个字符串
我怎样才能实现第二个?
它是一个字符串。
假设我有:
@string = "it is a <a href="#">string</a>"
我想以两种方式在我的应用程序的不同部分使用它:
第一个可以使用html_safe
:
@string.html_safe
它是一个字符串
我怎样才能实现第二个?
它是一个字符串。
你可以试试这个:
strip_tags(@string)
用于一般用途(例如网络刮板):
puts Rails::Html::FullSanitizer.new.sanitize("<div>Hello</div><br>")
# Hello
你可以用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
在 Rails 中,另请参见 strip_tags 方法。http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-strip_tags
Rails 提供了一个名为 的方法strip_links
,它似乎可以做你想做的事(看它的名字)。
根据其 APIDock 页面,它有点受限。要使其适用于/任何字符串,您可以扩展字符串类:
class String
def strip_links
ActionController::Base.helpers.strip_links(self)
end
end
所以你可以使用:
@string.strip_links
受楼上的启发,我在我的项目中定义了这个函数
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