我有一个模块,它将微笑(如":-)")替换为图标:
module Smileize
PATH = "/images/smiles"
SMILES = [/;-?p/i, /$-?)/, /8-?)/, />:-?(/, /:-?*/, /:-?o/i, /:-?c/i, /;-?)/,
/:-?s/i, /:-?|/, /:-?p/i, /:-?D/i, /:-??/, /:-?(/, /:-?)/]
def to_icon(key)
return "<img class='smiley' src='#{PATH}/smile#{SMILES.index(key) + 1}.png'/>"
end
module_function :to_icon
end
class String
def to_smile
Smileize::SMILES.each do |smile|
if self =~ smile
self.gsub!(smile, Smileize.to_icon(smile))
end
end
self
end
end
所以图片显示我正在使用html_safe,如下所示:
<%= @message.text.to_smile.html_safe %>
但它不适合我,因为图片和其他标签也会显示出来。
我的问题是:如何只显示我的微笑,而忽略其他标签?
我认为您需要这样做:
- HTML对字符串进行编码
- 执行替换
- 将最终结果标记为HTML安全
添加一个类似这样的助手:
def expand_smilies(s)
s = ERB::Util::html_escape(s)
Smileize::SMILES.each do |smile|
s.gsub!(smile, Smileize.to_icon(smile))
end
s.html_safe
end
然后在你的ERB:
<%= expand_smilies some_text %>
ERB使用ERB::Util::html_escape
对HTML进行编码,因此如果您的目标是ERB,那么自己使用它是有意义的。在字符串上调用html_safe
会返回一些东西,而当ERB对HTML进行编码时,它将不理会这些东西。
请注意,字符串上没有可用的html_safe!
,而html_safe
返回的是ActiveSupport::SafeBuffer而不是String,因此您必须使用助手而不是猴子将新方法修补到String中。ActiveSupport确实将html_safe!
方法修补到String中,但它所做的只是引发一个异常,说"不要那样做":
def html_safe!
raise "You can't call html_safe! on a String"
end