Rails - HTMLタグをすべて除去するヘルパーメソッド | AAC通信

Rails - HTMLタグをすべて除去するヘルパーメソッド

Author:BigBird


最近Railsの勉強にと、Blogツールを作ってます。

で、ごたぶんにもれずWYSIWYGエディタを編集画面に組み込んで(※とりあえずTinyMCE を使用)みました。


で、当然編集した文章はバリバリHTMLタグ入りまくりなわけです。そんな文章のサマリー表示をたとえば新着記事、として概要表示(続きを読む...>> みたいなリンクを添えて)させようと、文章をHTMLエスケープしてtruncateしたところ、あー、HTMLタグが邪魔なんだなぁ。。。


jyama

(リンクして拡大)


新着記事部分のコードはこんな感じです。

---------------------------------------------------------------------------------

<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/>


ほら、スッキリ!!

jyamajyanai
(クリックして拡大)



しかし、置換部分を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タグが除去され、見事に期待通りの表示と相成りました。あー、知らないってホント恐ろしい、というかむなしさすら覚えました。トホホ。



おしまい。