2011-09-14 15 views
92

Estoy trabajando con Ruby on Rails, ¿Hay alguna manera de eliminar html de una cadena usando sanitize o método igual y mantener solo el texto dentro del atributo de valor en la etiqueta de entrada?Strip html from string Ruby on Rails

+0

No esterilice o igual pero 'text.strip' funciona – Keon

Respuesta

142

Si queremos utilizar esto en el modelo

ActionView::Base.full_sanitizer.sanitize(html_string) 

que es el código en "strip_tags" método

+27

esto funciona, pero refiriéndose a ActionView del mdoel es incómoda. Más limpiamente puede 'requerir 'html/sanitizer'' y crear su propio sanitizador con' HTML :: FullSanitizer.new'. –

+6

@nhaldimann, 'require 'html/sanitizer'' provoca error, así que tengo que usar:' Rails :: Html :: FullSanitizer.new' (http://edgeapi.rubyonrails.org/classes/HTML/FullSanitizer.html# method-i-sanitize) –

19

Sí, llamar a esto: sanitize(html_string, :tags=>[])

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

lista blanca de etiquetas y los atributos se pueden especificar como abajo

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

La instrucción anterior permite etiquetas: img, br yp y atributos: src y estilo.

2

¿Qué tal esto?

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

También hay 'Rails :: Html :: FullSanitizer.new' si no desea especificar una lista blanca. – Fredrik

1

he utilizado la biblioteca de lufa, ya que es adecuado tanto para HTML y XML (ambos documentos y fragmentos de cuerda). Es el motor detrás de la gema desinfectante html. Simplemente estoy pegando el ejemplo del código para mostrar lo simple que es usarlo.

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 "