1

我这里有一个将表情符号(如“:-)”)替换为图标的模块:

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 %>

但它不适合我,因为但是也会显示图片和其他标签。

我的问题是:如何只显示我的微笑,而忽略其他标签?

4

1 回答 1

3

我认为你需要这样做:

  1. HTML 对字符串进行编码。
  2. 执行替换。
  3. 将最终结果标记为 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字符串会返回一些东西,当它是 HTML 编码的东西时,ERB 将不理会它。

请注意,没有可用html_safe!的字符串并html_safe返回ActiveSupport::SafeBuffer而不是字符串,因此您必须使用帮助程序而不是猴子将新方法修补到字符串中。ActiveSupport 确实将一个html_safe!方法修补到 String 中,但它所做的只是引发一个异常,说“不要那样做”:

def html_safe!
  raise "You can't call html_safe! on a String"
end
于 2011-06-28T14:37:48.080 回答