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?

Mattias
la source
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"

Jon
la source
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

Oui, appelez ceci: sanitize(html_string, tags:[])

bcackerman
la source
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 .

Satishakumar Awati
la source
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 "
Krishna Vedula
la source
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
Josetapadas
la source
Il y en a aussi Rails::Html::FullSanitizer.newsi vous ne souhaitez pas spécifier de liste blanche.
Fredrik