Retirar html da string Ruby on Rails


121

Estou trabalhando com Ruby on Rails, existe uma maneira de tirar html uma string usando o método sanitize ou equal e manter apenas o texto dentro do atributo value na tag de entrada?


Não higienizar ou igual, mas text.stripfunciona
Keon

Respostas:



183

Se quisermos usar isso no modelo

ActionView::Base.full_sanitizer.sanitize(html_string)

que é o código no método "strip_tags"


31
Isso funciona, mas a referência ao ActionView a partir do mdoel é estranha. Mais limpa você pode require 'html/sanitizer'e instanciar seu próprio desinfetante com HTML::FullSanitizer.new.
precisa saber é o seguinte

8
@nhaldimann, require 'html/sanitizer'gera erro por isso tenho de usar: Rails::Html::FullSanitizer.new( edgeapi.rubyonrails.org/classes/HTML/... )
Linh Dam


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

A lista branca de tags e atributos pode ser especificada como abaixo

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

A instrução acima permite que as tags img , br e p e os atributos src e style .


9

Eu usei a biblioteca Loofah, pois é adequada para HTML e XML (documentos e fragmentos de string). É o mecanismo por trás da jóia do desinfetante html. Estou simplesmente colando o exemplo de código para mostrar como é simples de usar.

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 "

1

Que tal agora?

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

Também existe Rails::Html::FullSanitizer.newse você não quiser especificar uma lista de permissões.
Fredrik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.