2010-04-05 55 views
11

Tôi có một mô hình Dự án và nó có một số thuộc tính văn bản, một là tóm tắt. Tôi có một số dự án có thẻ html trong bản tóm tắt và tôi muốn chuyển đổi nó thành văn bản thuần túy. Tôi có phương pháp này có một regex sẽ loại bỏ tất cả các thẻ html.Xóa tất cả các thẻ html khỏi các thuộc tính trong đường ray

def strip_html_comments_on_data 
    self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")} 
end 

Tôi cũng có một bộ lọc before_save

before_save :strip_html_comments_on_data 

Vấn đề là các thẻ html vẫn còn ở đó sau khi tiết kiệm dự án. Tôi đang thiếu gì?

Và, có cách nào thực sự dễ dàng để có phương pháp đó được gọi trong tất cả các mô hình không?

Cảm ơn,

Nicolás Hock Isaza

+2

Tôi không phải là một người sử dụng ruby, nhưng có vẻ không phải là bất kỳ chuyển nhượng xảy ra ở đó. Bạn đang tính toán một chuỗi với những thứ bị loại bỏ, nhưng không tiết kiệm được ở bất cứ đâu. – Yuliy

+0

@Yuliy ruby ​​có các chuỗi có thể thay đổi được! (gsub! là dạng biến dạng của gsub - ick!) !!! (cho biện pháp tốt) !!! (và +1 để làm cho tôi nhìn vào nó khó khăn hơn) –

Trả lời

44

chưa được kiểm tra

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

nơi html_input là một chuỗi chứa các thẻ HTML.

EDIT

Bạn có thể tước tất cả các thẻ bằng cách thông qua :tags=>[] như một tùy chọn:

plain_text = sanitize(html_input, :tags=>[])

Mặc dù đọc docs tôi thấy có một phương pháp tốt hơn:

plain_text = strip_tags(html_input)

Sau đó, làm cho nó thành một bộ lọc trước trên mỗi smotchkiss và bạn tốt để đi.

+0

Tôi không muốn khử trùng nó. Tôi muốn loại bỏ chúng. Nếu tôi có xin chào Tôi muốn lưu trữ chỉ xin chào – Hock

+0

xem phiên bản đã chỉnh sửa – zetetic

+0

Có! ông strip_tags là cách tốt nhất để đi. Cảm ơn bạn! – Hock

1

Đầu tiên, vấn đề ở đây là Array#each trả về mảng đầu vào bất kể nội dung khối. Một vài người chỉ cần đi qua Array#each với tôi trong một câu hỏi tôi hỏi: "Return hash with modified values in Ruby".

Thứ hai, Ngoài Array#each không thực sự làm những gì bạn muốn ở đây, tôi không nghĩ bạn nên làm điều này. Tại sao bạn cần phải chạy phương thức này trên TẤT CẢ thuộc tính của mô hình?

Cuối cùng, tại sao không giữ đầu vào HTML từ người dùng và chỉ sử dụng trình trợ giúp chuẩn h() khi xuất ra?

# this will output as plain text 
<%=h string_with_html %> 

Điều này rất hữu ích vì bạn có thể xem cơ sở dữ liệu và xem dữ liệu chưa sửa đổi chính xác khi người dùng nhập (nếu cần). Nếu bạn thực sự phải chuyển đổi thành văn bản thuần tuý trước khi lưu giá trị, giải pháp @ zetetic sẽ giúp bạn bắt đầu.

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

    protected 
    def sanitize_html 
    self.text = sanitize(text) 
    end 

end 
4

Chỉ cần sử dụng strip_tags() văn bản helper như đã đề cập bởi zetetic

10

Sẽ tốt hơn là không bao gồm xem những người giúp đỡ trong mô hình của bạn.Chỉ cần sử dụng:

HTML::FullSanitizer.new.sanitize(text) 
1

Tham chiếu Bộ vệ sinh trực tiếp của Rails mà không sử dụng bao gồm.

def text 
    ActionView::Base.full_sanitizer.sanitize(html).html_safe 
end 

LƯU Ý: Tôi nối thêm .html_safe để tạo các thực thể HTML như &nbsp; hiển thị chính xác. Không sử dụng điều này nếu có khả năng tiêm JavaScript độc hại.

0

Nếu bạn muốn loại bỏ &nbsp; cùng với các thẻ html, nokogiri thể được sử dụng

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = strip_tags(html_input) 
    Nokogiri::HTML.fragment(sanitized_output) 
end 
Các vấn đề liên quan