Entfernen Sie HTML von der Zeichenfolge Ruby on Rails

121

Ich arbeite mit Ruby on Rails. Gibt es eine Möglichkeit, htmleinen String mit der Methode sanitize oder equals zu entfernen und nur Text im Wertattribut des Eingabe-Tags zu belassen?

Mattias
quelle
Nicht desinfizieren oder gleich, aber text.stripfunktioniert
Keon

Antworten:

183

Wenn wir dies im Modell verwenden wollen

ActionView::Base.full_sanitizer.sanitize(html_string)

Dies ist der Code in der Methode "strip_tags"

Jon
quelle
31
Dies funktioniert, aber das Verweisen auf ActionView aus dem mdoel ist umständlich. Sauberer können Sie require 'html/sanitizer'und instanziieren Sie Ihr eigenes Desinfektionsmittel mit HTML::FullSanitizer.new.
Nik Haldimann
8
@nhaldimann, require 'html/sanitizer'löst Fehler aus, so dass ich verwenden muss: Rails::Html::FullSanitizer.new( edgeapi.rubyonrails.org/classes/HTML/… )
Linh Dam
24

Ja, nennen Sie das: sanitize(html_string, tags:[])

bcackerman
quelle
24
ActionView::Base.full_sanitizer.sanitize(html_string)

Eine weiße Liste von Tags und Attributen kann wie folgt angegeben werden

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

Die obige Anweisung erlaubt die Tags img , br und p sowie die Attribute src und style .

Satishakumar Awati
quelle
9

Ich habe die Loofah-Bibliothek verwendet, da sie sowohl für HTML als auch für XML (sowohl Dokumente als auch Zeichenfolgenfragmente) geeignet ist. Es ist der Motor hinter dem HTML-Desinfektionsjuwel. Ich füge einfach das Codebeispiel ein, um zu zeigen, wie einfach es zu verwenden ist.

Luffa Edelstein

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 "
Krishna Vedula
quelle
1

Wie wäre es damit?

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
Josetapadas
quelle
Es gibt auch, Rails::Html::FullSanitizer.newwenn Sie keine Whitelist angeben möchten.
Fredrik