LoginSignup
23
12

More than 1 year has passed since last update.

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

Last updated at Posted at 2017-12-21

はじめに

ここでいう 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 などでしょうか?

Ruby 2.7 でさらに高速化(2019-12-04 追記)

Ruby 2.7 で,CGI.escapeHTML がさらに高速化したそうです。

参考:

別名もあるよ(2019-12-23 追記,2021-12-02 書き直し)

escapeHTML というメソッド名が Ruby ぽくなくて気に入らないなら,escape_html という別名エイリアスもあります。
ただし,この別名は cgi/escape では定義されていないので,こちらを使いたければ

require "cgi/escape"

ではなく

require "cgi/util"

とする必要があります。

23
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
12