2011-09-14 13 views
92

私はRuby on Railsで作業しています。htmlをサニタイズまたは等価メソッドを使用して文字列から取り除き、入力タグの値属性の中にテキストのみを保持する方法はありますか?文字列からのhtmlの文字列

+0

サニタイズまたは等しいが、 'text.strip'は、これは動作しますが、mdoelからActionViewに言及することは厄介である – Keon

答えて

142

我々はモデル "strip_tags" 方法

+27

を働くわけではありません。もっときれいに 'html/sanitizer'を必要とし、' HTML :: FullSanitizer.new'であなた自身のサニタイザをインスタンス化することができます。 –

+6

@nhaldimann、 'require 'html/sanitizer''がエラーを発生させるので、' Rails :: Html :: FullSanitizer.new'(http://edgeapi.rubyonrails.org/classes/HTML/FullSanitizer.html# method-i-sanitize) –

19

はい、これを呼び出すのコードである

ActionView::Base.full_sanitizer.sanitize(html_string) 

でこれを使用したい場合は、次のタグのsanitize(html_string, :tags=>[])

8
ActionView::Base.full_sanitizer.sanitize(html_string) 

ホワイトリストと属性は以下のように指定できます。

ActionView::Base.full_sanitizer.sanitize(html_string, :tags => %w(img br p), :attributes => %w(src style)) 

上記のステートメントでは、タグ:img、br、p と の属性:srcとstyleを使用できます。

2

これはいかがですか?

white_list_sanitizer = Rails::Html::WhiteListSanitizer.new 
WHITELIST = ['p','b','h1','h2','h3','h4','h5','h6','li','ul','ol','small','i','u'] 


[Your, Models, Here].each do |klass| 
    klass.all.each do |ob| 
    klass.attribute_names.each do |attrs| 
     if ob.send(attrs).is_a? String 
     ob.send("#{attrs}=", white_list_sanitizer.sanitize(ob.send(attrs), tags: WHITELIST, attributes: %w(id style)).gsub(/<p>\s*<\/p>\r\n/im, '')) 
     ob.save 
     end 
    end 
    end 
end 
+0

ホワイトリストを指定したくない場合は 'Rails :: Html :: FullSanitizer.new'もあります。 – Fredrik

1

私はそれがHTMLやXML(文書や文字列フラグメントの両方)の両方に適しているとして、ヘチマライブラリを使用しました。 htmlサニタイザーの宝石の背後にあるエンジンです。私はコードサンプルを単に貼り付けて、どれだけシンプルに使うのかを示しています。

Loofah Gem

unsafe_html = "ohai! <div>div is safe</div> <script>but script is not</script>" 

doc = Loofah.fragment(unsafe_html).scrub!(:strip) 
doc.to_s # => "ohai! <div>div is safe</div> " 
doc.text # => "ohai! div is safe "