2011-09-14 16 views
92

Pracuję z Ruby on Rails, Czy istnieje sposób na usunięcie html z ciągu znaków przy użyciu metody dezynfekcji lub równości i zachowanie tylko tekstu wewnątrz atrybutu wartości w tagu wejściowym?Strip html z ciągu Ruby on Rails

+0

Nie zdezynfekować lub równe, ale 'text.strip' działa – Keon

Odpowiedz

142

Jeśli chcemy użyć tego w modelu

ActionView::Base.full_sanitizer.sanitize(html_string) 

która jest kod w "strip_tags" metoda

+27

To działa, ale nawiązując do actionView z mdoel jest niewygodne. Bardziej czysto można "wymagać" html/sanitizer'' i utworzyć instancję dezynfekującą za pomocą 'HTML :: FullSanitizer.new'. –

+6

@nhaldimann, 'require 'html/sanitizer'' podnosi błąd, więc muszę użyć:' Rails :: Html :: FullSanitizer.new' (http://edgeapi.rubyonrails.org/classes/HTML/FullSanitizer.html# method-i-sanitize) –

19

Tak, nazywamy to: sanitize(html_string, :tags=>[])

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

Białą listę tagów i atrybuty można określać jako

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

Powyższe zestawienie umożliwia stosowanie znaczników: img, br i p oraz atrybutów: src i style.

2

Co z tym?

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

Istnieje również 'Rails :: Html :: FullSanitizer.new', jeśli nie chcesz określać białej listy. – Fredrik

1

Użyłem biblioteki Loofah, ponieważ jest ona odpowiednia zarówno dla HTML, jak i XML (zarówno dokumentów, jak i fragmentów napisów). To jest silnik za klejnotem sanitizer html. Po prostu wklejam przykład kodu, aby pokazać, jak prosty jest w użyciu.

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 "