2012-03-29 23 views
6

sanitize() trong ApplicationHelper không đóng thẻ.Vệ sinh HTML và đóng các thẻ chưa hoàn thành

s = "<a href='http://example.com'>incomplete" 
sanitize(s, :tags => ['a', 'p']) 

Đoạn mã trên để nguyên chuỗi như vậy. Làm thế nào tôi có thể buộc nó để đóng một </a> đóng hoặc ít nhất là dải <a> hoàn toàn?

Trả lời

2

Câu trả lời được cập nhật là

html = "<a href='http://example.com'>incomplete" 
html = sanitize(s, tags: %w[a p]) 
Nokogiri::HTML::DocumentFragment.parse(html).to_html 
+0

Dòng cuối cùng của chính nó đã làm việc tuyệt vời cho tôi và đóng các thẻ không được đính kèm. –

5

Bạn có thể sử dụng trình phân tích cú pháp HTML thích hợp để thực hiện việc này. Tôi muốn giới thiệu Nokogiri cho công việc:

require 'nokogiri' 
# ... 
s = "<a href='http://example.com'>incomplete" 
Nokogiri::HTML::fragment(sanitize(s, :tags => ['a', 'p'])).to_xml 
# => "<a href=\"http://example.com\">incomplete</a>" 

Điều này sẽ luôn trả về XML hợp lệ. Tất nhiên bạn có thể gói nó vào phương thức trợ giúp của riêng bạn để sử dụng dễ dàng hơn.