Strip html จากสตริง Ruby on Rails


121

ฉันกำลังทำงานกับ Ruby on Rails มีวิธีการดึงhtmlออกจากสตริงโดยใช้วิธีการฆ่าเชื้อหรือเท่ากับและเก็บเฉพาะข้อความไว้ในแอตทริบิวต์ค่าบนแท็กอินพุตหรือไม่?


ไม่ฆ่าเชื้อหรือเท่าเทียมกัน แต่text.stripใช้ได้ผล
Keon

คำตอบ:


138

มีstrip_tagsวิธีการในActionView::Helpers::SanitizeHelper:

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-strip_tags

แก้ไข: สำหรับการรับข้อความภายในแอตทริบิวต์ค่าคุณสามารถใช้บางอย่างเช่น Nokogiri กับนิพจน์ Xpath เพื่อดึงสิ่งนั้นออกจากสตริง


183

หากเราต้องการใช้สิ่งนี้ในแบบจำลอง

ActionView::Base.full_sanitizer.sanitize(html_string)

ซึ่งเป็นรหัสในเมธอด "strip_tags"


31
ใช้งานได้ แต่การอ้างถึง ActionView จาก mdoel นั้นน่าอึดอัดใจ เพิ่มเติมหมดจดคุณสามารถและอินสแตนซ์เจลทำความสะอาดของคุณเองด้วยrequire 'html/sanitizer' HTML::FullSanitizer.new
Nik Haldimann

8
@nhaldimann require 'html/sanitizer'ทำให้เกิดข้อผิดพลาดดังนั้นฉันจึงต้องใช้: Rails::Html::FullSanitizer.new( edgeapi.rubyonrails.org/classes/HTML/… )
Linh Dam


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

รายการแท็กและแอตทริบิวต์สีขาวสามารถระบุได้ว่าเป็นการร้อง

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

เหนือคำสั่งอนุญาตให้แท็กimg , brและPและแอตทริบิวต์srcและสไตล์


9

ฉันเคยใช้ไลบรารี Loofah เนื่องจากเหมาะสำหรับทั้ง HTML และ XML (ทั้งเอกสารและส่วนสตริง) เป็นเครื่องยนต์ที่อยู่เบื้องหลังอัญมณีเจลทำความสะอาด html ฉันแค่วางโค้ดตัวอย่างเพื่อแสดงให้เห็นว่ามันใช้ง่ายแค่ไหน

รังบวบอัญมณี

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

แล้วเรื่องนี้ล่ะ?

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

นอกจากนี้ยังมีRails::Html::FullSanitizer.newหากคุณไม่ต้องการระบุรายการที่อนุญาตพิเศษ
Fredrik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.