2011-09-14 38 views
92

Tôi đang làm việc với Ruby on Rails, Có cách nào để tách html khỏi chuỗi sử dụng phương pháp khử trùng hoặc bằng và chỉ giữ văn bản bên trong thuộc tính giá trị trên thẻ đầu vào không?Dải html từ chuỗi Ruby on Rails

+0

Không khử trùng hoặc tương đương nhưng 'text.strip' làm việc – Keon

Trả lời

142

Nếu chúng ta muốn sử dụng này trong mô hình

ActionView::Base.full_sanitizer.sanitize(html_string) 

đó là mã trong "strip_tags" phương pháp

+27

này làm việc nhưng đề cập đến ActionView từ mdoel là vụng về. Sạch hơn bạn có thể 'yêu cầu 'html/sanitizer'' và nhanh chóng khử trùng của riêng bạn với' HTML :: FullSanitizer.new'. –

+6

@nhaldimann, 'require 'html/sanitizer'' gây ra lỗi vì vậy tôi phải sử dụng:' Rails :: Html :: FullSanitizer.new' (http://edgeapi.rubyonrails.org/classes/HTML/FullSanitizer.html# phương pháp-i-sanitize) –

19

Vâng, hãy gọi này: sanitize(html_string, :tags=>[])

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

danh sách trắng của thẻ và các thuộc tính có thể được chỉ định dưới dạng

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

Tuyên bố trên cho phép các thẻ: img, br và p và thuộc tính: src và kiểu.

2

Làm thế nào về điều này?

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 
+0

Ngoài ra còn có 'Rails :: Html :: FullSanitizer.new' nếu bạn không muốn chỉ định một danh sách trắng. – Fredrik

1

Tôi đã sử dụng thư viện Loofah, vì nó phù hợp cho cả HTML và XML (cả tài liệu và đoạn chuỗi). Nó là động cơ đằng sau đá quý khử trùng html. Tôi chỉ đơn giản dán ví dụ mã để hiển thị mức độ dễ sử dụng của nó.

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 "