はじめに
ここでいう HTML エスケープは,文字列中の &
や <
などを &
や <
などの文字参照に変換することを指します。
Rails などのウェブアプリケーションフレームワークや何らかの HTML テンプレートシステムなどを使っている場合,HTML エスケープのためのメソッドが用意されているので,それを使えばいいでしょう。
そうでない場合はどうするか,というのがこの記事の主旨です。
自前で実装
自分で Ruby で実装するなら,おそらく以下のようなコードが最適でしょう。
ESCAPE_TABLE = {
'&' => '&',
'<' => '<',
'>' => '>',
'"' => '"',
"'" => '''
}
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'") # => "<a> & 'b'"
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 などでしょうか?
Ruby 2.7 でさらに高速化(2019-12-04 追記)
Ruby 2.7 で,CGI.escapeHTML
がさらに高速化したそうです。
参考:
- Ruby 2.7.0-preview3 リリース
- Optimize CGI.escapeHTML by reducing buffer extension and branches by k0kubun · Pull Request #2226 · ruby/ruby
別名もあるよ(2019-12-23 追記,2021-12-02 書き直し)
escapeHTML
というメソッド名が Ruby ぽくなくて気に入らないなら,escape_html
という別名もあります。
ただし,この別名は cgi/escape
では定義されていないので,こちらを使いたければ
require "cgi/escape"
ではなく
require "cgi/util"
とする必要があります。