Rails - HTMLタグをすべて除去するヘルパーメソッド
Author:BigBird
最近Railsの勉強にと、Blogツールを作ってます。
で、ごたぶんにもれずWYSIWYGエディタを編集画面に組み込んで(※とりあえずTinyMCE を使用)みました。
で、当然編集した文章はバリバリHTMLタグ入りまくりなわけです。そんな文章のサマリー表示をたとえば新着記事、として概要表示(続きを読む...>> みたいなリンクを添えて)させようと、文章をHTMLエスケープしてtruncateしたところ、あー、HTMLタグが邪魔なんだなぁ。。。
(リンクして拡大)
新着記事部分のコードはこんな感じです。
---------------------------------------------------------------------------------
<div id="whatsNew">
新着記事
<table>
<% for content in @latest_contents -%>
<tr>
<td>
<%= fmt_datetime3(content.release_at) %>:
<%= link_to (content.title,
{:controller => 'theme_viewer',
:action => 'get_content',
:content_id => content.id } ) %><br/>
<%= truncate(h(content.description), 80) %><p/>
</td>
</tr>
<% end -%>
</table>
</div>
----------------------------------------------------------------------------------
新着記事の紹介なので、サマリーだけ分かればよく、装飾はいらないので表示の際にHTMLタグをはずすことにしました。RailsのAPIであるのかなぁ、と思ってドキュメントを探してみたのですが、とりあえず見つからなかったのでこれまた勉強がてら作ることに。
正規表現で置換すれば、というノリでヘルパーメソッド(app/helpers/application_helper.rb)として作成したメソッドがこれです。
----------------------------------------------------------------------------------
# HTMLタグをすべて除去
def rm_html_tag(str)
str.sub!(/<[^<>]*>/,"") while /<[^<>]*>/ =~ str
str
end
----------------------------------------------------------------------------------
渡したstrの中に<>で囲まれた部分を<>を含めぜーんぶ空文字で置換する、という処理イメージです。
しかし、、正規表現ってその呪文のような記述が恐ろしく、出来るだけかかわらないように無意識に生きてきたこともあり「苦手」なんですが、とりあえずいろんなサイトを参考にしつつ、irbを使用して試行錯誤を行った結果、、、
<[^<>]*> ~ <> で囲まれていて、その中身が "<" と ">" 以外の文字が0回以上続く文字列
という正規表現を結果的に作ることが出来ました!!
というわけで、このメソッドを先ほどのビューにおける赤字部分に適用すると、、、
修正前: <%= truncate(h(content.description), 80) %><p/>
修正後: <%= truncate(rm_html_tag(content.description), 80) %><p/>
ほら、スッキリ!!
しかし、置換部分を1行で書けてしまったことにびっくりしてしまいました。正規表現&Ruby恐るべし。Rubyは0をfalseとして扱わない、というのがいいですね。
/<[^<>]*>/ =~ str の演算結果は、左辺の正規表現に一致する文字列がstrの中にあれば、その開始インデックスを返します。先頭にみつかれば0を返しますし、先頭でなければ1以降の数字を返します。一方で一致する文字列が無ければnilを返しますので、今回のように while /<[^<>]*>/ =~ str というシンプルなコードを可能としているのかなと。
書く前は正規表現も分かっていないことも手伝い、結構時間かかるかなと思ったのですが、秀逸なサイト・Ruby・irbのおかげで30分程度で対応できました。これを1分とかでかけるようになるために更なる修行を、、、というところです。
おしまい......
と気分良く終わりたかったのですが、その後サイトを検索したところ
ヽ( ・∀・)ノくまくまー [Rails] さんのページにActionView::Helpers::TextHelper に関する日記 がありました。
日記によるとこのActionView::Helpers::TextHelperにはHTMLを加工するようなヘルパーメソッドがいろいろと用意されている、ということでした。そこでライブラリを覗いてみたところ(ファイルは$RUBY_HOME\lib\ruby\gems\1.8\gems\actionpack-1.13.3\lib\action_view\helpers\text_helper.rb)、ありました。。。。strip_tagsというメソッドが。処理の中身は後ほどじっくり調べるとして、取り急ぎ私が作ったメソッドと差し替えたところ。。。
修正前: <%= truncate(rm_html_tag(content.description), 80) %><p/>
修正後: <%= truncate(strip_tags(content.description), 80) %><p/>
きれいさっぱりHTMLタグが除去され、見事に期待通りの表示と相成りました。あー、知らないってホント恐ろしい、というかむなしさすら覚えました。トホホ。
おしまい。