2011-06-28 8 views
0

Я пытаюсь дезинфицировать HTML-файл, и он работает неправильно. Я хочу, чтобы все были полностью обычным текстом, за исключением тегов абзаца и разрыва строки. Вот мой санитарный код (многоточие означает другой код в моем классе, который не имеет отношения к проблеме):Rails HTML Sanitizing

. 
. 
. 
include ActionView::Helpers::SanitizeHelper 
. 
. 
. 
def remove_html(html_content) 
    sanitized_content_1 = sanitize(html_content, :tags => %w(p br)) 
    sanitized_content_2 = Nokogiri::HTML(sanitized_content_1) 
    sanitized_content_2.css("style","script").remove 
    return sanitized_content_2 
end 

Это не работает правильно. Here is the original HTML file, из которого функция считывает свой вход, и here is the "sanitized" code it is returning. Он уходит в тело тегов CSS, JavaScript и HTML Comment Tags. Возможно, это может быть и в других вещах, которые я не заметил. Пожалуйста, сообщите, как полностью удалить все CSS, HTML и JavaScript, кроме тегов абзацев и тегов.

+0

Это похоже больше на синтаксический анализ, чем на дезинфекцию. –

+0

Ничего себе, формат Scribd неудобен для решения. Можете ли вы представить суть? –

ответ

0

Я не думаю, что вы хотите его дезинфицировать. Sanitizing strips HTML, оставляя текст позади, за исключением HTML-элементов, которые вы считаете ОК. Он предназначен для того, чтобы поле ввода пользователя содержало некоторую разметку.

Вместо этого вы, вероятно, захотите его разобрать. Например, следующее будет печатать текстовое содержимое тегов <p> в данной строке html.

doc = Nokogiri::HTML.parse(html) 

doc.search('p').each do |el| 
    puts el.text 
end 
0

Вы также можете дезинфицировать с использованием пространства имен CGI.

require 'CGI' 
str = "<html><head><title>Hello</title></head><body></body></html>" 
p str 
p CGI::escapeHTML str 

Запустить этот скрипт, получим следующий результат.

$ ruby sanitize.rb 
"<html><head><title>Hello</title></head><body></body></html>" 
"&lt;html&gt;&lt;head&gt;&lt;title&gt;Hello&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;"