RubyでHTMLタグ除去

Railsでsanitizeやstrip_tagsといったメソッドが存在するが、ビューのヘルパーとして定義されているので、どこでも使えるものではない。
これをコントローラーやモデルの中で何とかして使うこともできるようだが、同等の機能を提供するSanitizeというgemがあるのでこちらを使った方が楽だ。

導入

gemで入れる。

gem install sanitize

使い方

すべてのタグを削除する

Sanitize.clean(html_string)でhtml_string内のタグを削除する。
irbで試してみる。

 :001 > require 'sanitize'
 => true 
 :002 > html_string = "<h1>hello clean world</h1>"
 => "<h1>hello clean world</h1>" 
 :003 > Sanitize.clean(html_string)
 => " hello clean world "

デリシャス。

タグ除去された文字列の両端に半角スペースが入っているのは、h1がブロック要素であるため。
基本的にブロック要素になるタグは削除の際にタグのあった場所に半角スペースが挿入される。

spanなどのインライン要素を削除した後には半角スペースは残らない。
この挙動はwhitespace_elementsというオプションでカスタマイズすることができる。

許可したタグは削除しない

Sanitize.cleanをただ呼び出すとすべてのタグを削除するが、許可するタグや属性をオプションで指定することもできる。

例えば:elementsで許可するタグを配列で指定する。

Sanitize.clean(html, :elements => %w{p strong ul li})

ビルトインで以下の設定が用意されている。

  • Sanitize::Config::BASIC
  • Sanitize::Config::RELAXED
  • Sanitize::Config::RESTRICTED
Sanitize.clean(html, Sanitize::Config::BASIC)

RELAXEDはいろいろと許容する。
RESTRICTEDはほとんどのタグを削除する。
BASICはその中間。
それぞれの設定で具体的にどのタグが許容されるかはソースを見た方が早い。

その他オプションでけっこうかゆいところに手が届くようになっているので、もっと細かい動作の指定がしたいんだけど・・・なんて場合はREADMEを読んでみるとよい。