Usuń kod HTML z łańcucha Ruby on Rails

121

Pracuję z Ruby on Rails, czy istnieje sposób na usunięcie htmlz łańcucha przy użyciu metody sanitize lub equal i zachowanie tylko tekstu wewnątrz atrybutu value na tagu wejściowym?

Mattias
źródło
Nie dezynfekuje ani nie jest równy, ale text.stripdziała
Keon

Odpowiedzi:

183

Jeśli chcemy to wykorzystać w modelu

ActionView::Base.full_sanitizer.sanitize(html_string)

czyli kod w metodzie „strip_tags”

Jon
źródło
31
To działa, ale odwoływanie się do ActionView z mdoel jest niewygodne. Czystsze jest to, że możesz require 'html/sanitizer'i utworzysz własny odkażacz za pomocą HTML::FullSanitizer.new.
Nik Haldimann
8
@nhaldimann, require 'html/sanitizer'wywołuje błąd, więc muszę użyć: Rails::Html::FullSanitizer.new( edgeapi.rubyonrails.org/classes/HTML/… )
Linh Dam
24

Tak, nazwij to: sanitize(html_string, tags:[])

bcackerman
źródło
24
ActionView::Base.full_sanitizer.sanitize(html_string)

Białą listę tagów i atrybutów można określić poniżej

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

Powyższa instrukcja zezwala na tagi img , br i p oraz atrybuty src i style .

Satishakumar Awati
źródło
9

Użyłem biblioteki Loofah, ponieważ nadaje się zarówno do HTML, jak i XML (zarówno dokumenty, jak i fragmenty ciągów). Jest to silnik stojący za gemem dezynfekcji HTML. Po prostu wklejam przykładowy kod, aby pokazać, jak prosty jest w użyciu.

Klejnot Loofah

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 "
Kryszna Vedula
źródło
1

Co powiesz na to?

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
źródło
Jest też, Rails::Html::FullSanitizer.newjeśli nie chcesz określać białej listy.
Fredrik