Supprimez le code HTML de la chaîne Ruby on Rails


121

Je travaille avec Ruby on Rails, existe-t-il un moyen de supprimer htmlune chaîne en utilisant la méthode sanitize ou equal et de ne conserver que le texte à l'intérieur de l'attribut value sur la balise d'entrée?


Pas de désinfection ou égal mais text.stripfonctionne
Keon

Réponses:



183

Si nous voulons l'utiliser dans le modèle

ActionView::Base.full_sanitizer.sanitize(html_string)

qui est le code de la méthode "strip_tags"


31
Cela fonctionne, mais se référer à ActionView à partir du mdoel est gênant. Plus proprement, vous pouvez require 'html/sanitizer'et instancier votre propre désinfectant avec HTML::FullSanitizer.new.
Nik Haldimann

8
@nhaldimann, génère une require 'html/sanitizer'erreur, je dois donc utiliser: Rails::Html::FullSanitizer.new( edgeapi.rubyonrails.org/classes/HTML/… )
Linh Dam


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

La liste blanche des balises et des attributs peut être spécifiée comme ci-dessous

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

L'instruction ci-dessus autorise les balises img , br et p et les attributs src et style .


9

J'ai utilisé la bibliothèque Loofah, car elle convient à la fois au HTML et au XML (documents et fragments de chaîne). C'est le moteur derrière le joyau du désinfectant html. Je colle simplement l'exemple de code pour montrer à quel point il est simple à utiliser.

Gemme de 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 "

1

Que dis-tu de ça?

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

Il y en a aussi Rails::Html::FullSanitizer.newsi vous ne souhaitez pas spécifier de liste blanche.
Fredrik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.