Eliminar html de la cadena Ruby on Rails

121

Estoy trabajando con Ruby on Rails, ¿hay alguna manera de quitar htmluna cadena usando el método desinfectar o igual y mantener solo el texto dentro del atributo de valor en la etiqueta de entrada?

Mattias
fuente
No desinfecta ni iguala, pero text.stripfunciona
Keon

Respuestas:

183

Si queremos usar esto en el modelo

ActionView::Base.full_sanitizer.sanitize(html_string)

cuál es el código del método "strip_tags"

Jon
fuente
31
Esto funciona, pero hacer referencia a ActionView desde mdoel es incómodo. De manera más limpia, puede require 'html/sanitizer'crear una instancia de su propio desinfectante HTML::FullSanitizer.new.
Nik Haldimann
8
@nhaldimann, require 'html/sanitizer'genera un error, así que tengo que usar: Rails::Html::FullSanitizer.new( edgeapi.rubyonrails.org/classes/HTML/… )
Linh Dam
24

Sí, llame a esto: sanitize(html_string, tags:[])

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

La lista blanca de etiquetas y atributos se puede especificar a continuación

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

La declaración anterior permite las etiquetas img , br y py los atributos src y style .

Satishakumar Awati
fuente
9

He usado la biblioteca Loofah, ya que es adecuada tanto para HTML como para XML (tanto documentos como fragmentos de cadenas). Es el motor detrás de la gema desinfectante html. Simplemente pego el ejemplo de código para mostrar lo simple que es de usar.

Gema de lufa

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
fuente
1

¿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
josetapadas
fuente
También existe Rails::Html::FullSanitizer.newsi no desea especificar una lista blanca.
Fredrik