Rails HTML Sanitizing - PullRequest
       44

Rails HTML Sanitizing

0 голосов
/ 28 июня 2011

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

.
.
.
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

Это не работает правильно. Вот исходный HTML-файл , из которого функция читает свои входные данные, а - это "очищенный" код, который она возвращает . Он остается в теле тегов CSS, JavaScript и тегов комментариев HTML. Это может быть и в других вещах, которые я не заметил. Посоветуйте, пожалуйста, как полностью удалить все CSS, HTML и JavaScript, кроме тегов абзаца и разрыва строки?

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Вы можете выполнить санитарную обработку, используя пространство имен 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;"
0 голосов
/ 29 июня 2011

Не думаю, что вы хотите санировать это. Санитарная обработка полос HTML, оставляя текст позади, за исключением тех элементов HTML, которые вы считаете нормальными. Он предназначен для того, чтобы поле ввода пользователя могло содержать некоторую разметку.

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

doc = Nokogiri::HTML.parse(html)

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