railsでsanitizeすると閉じタグを付け忘れた時にタグが続いてしまう

sanitizeというメソッドを使うと、ホワイトリストに載ったHTMLタグ以外を削除して出力できる。例えば以下のようなコード(haml)を書くと、

%p
  - dummy_text = '斜め'
  = raw(sanitize(dummy_text))
斜め

と出力される。

通常はこれで問題ないが、タグが閉じられないままだと、続けて出力されてしまう。

%p
  - dummy_texts = ['<i>斜め' '斜めったまま']
  - dummy_texts.each do |dummy_text|
    %p
      = raw(sanitize(dummy_text))

↓こんな感じ。

斜め
斜めったまま

つまり、validではないHTMLをvalidにするにはどうすればいいかという問題。

この場合、nokogiriを使うと、validなHTMLに変換することができる。Gemfileにgem 'nokogiri'を加えてから、以下のように書くとうまく変換される。

%p
  - dummy_texts = ['<i>斜め' '斜めってない']
  - dummy_texts.each do |dummy_text|
    %p
      = raw(Nokogiri::HTML::fragment(sanitize(dummy_text)).to_xml)
斜め
斜めってない

Nokogiri::HTML::fragmentのto_xmlを使うと、完全な状態になってるxmlとして出力できるようだ。

参考:Sanitize HTML and close incomplete tags – stackoverflow

Pocket
LINEで送る
LinkedIn にシェア