Ruby
HTML

素の Ruby で HTML エスケープするなら cgi/escapeが最強

はじめに

ここでいう HTML エスケープは,文字列中の &< などを &amp;&lt; などの文字参照に変換することを指します。

Rails などのウェブアプリケーションフレームワークや何らかの HTML テンプレートシステムなどを使っている場合,HTML エスケープのためのメソッドが用意されているので,それを使えばいいでしょう。

そうでない場合はどうするか,というのがこの記事の主旨です。

自前で実装

自分で Ruby で実装するなら,おそらく以下のようなコードが最適でしょう。

ESCAPE_TABLE = {
  '&' => '&amp;',
  '<' => '&lt;',
  '>' => '&gt;',
  '"' => '&quot;',
  "'" => '&#39;'
}

def escape_html(str)
  str.gsub(/[&<>"']/, ESCAPE_TABLE)
end

cgi/escape を使え

HTML エスケープ用メソッドを自前で書く必要はありません。
標準添付ライブラリー cgi に用意されているからです。

CGI を書く人がほとんどいなくなった今,忘れられたライブラリーとも言えそうです。

「でも,たかがエスケープのために CGI なんか扱うゴツい(?)ライブラリー読み込むのヤだなあ」ですって?
いえいえ,Ruby 1.9 以降の cgi ライブラリーはいくつかに分割されているので,HTML エスケープのためのライブラリーファイルだけを読み込めばいいのです。
Ruby 2.3 以降なら,cgi/escape だけ読み込めば OK です。

以下のように使います。

require "cgi/escape"

puts CGI.escapeHTML("<a> & 'b'") # => "&lt;a&gt; &amp; &#39;b&#39;"

cgi/escape は何が嬉しいのか

cgi ライブラリーにおける CGI.escapeHTML は,Ruby 2.2 までは Ruby で書かれていました。
それが,C によって書き直され,Ruby 2.3 に搭載されました。

これによりエスケープ処理が格段に高速化されたのです。
もうコレ一択ですね!

おまけ:cgi/util について

最後に,cgi/util ライブラリーについて述べておきます。

cgi/escape が Ruby 2.3 で導入された C 実装のライブラリーであるのに対し,cgi/util は Ruby 2.2 以前も 2.3 以降も存在する,Ruby で書かれたライブラリーです。

cgi/util には,エスケープ処理などに関するいくつかのメソッドやエイリアスが定義されています。

Ruby 2.3 以降は,〈もし cgi/escape が無かったら cgi/util 内で定義された escapeHTML メソッドが生きる〉ようになっています。
cgi/escape が無い場合」というのは, JRuby などでしょうか?

また,escapeHTML のエイリアス escape_htmlcgi/util のほうで定義されているので,cgi/escape を読み込んだだけでは使えません。