Я полагаю, что это достаточно часто, так что это решаемая проблема, но, будучи новичком в Loofah и Nokogiri, я пока не нашел решения.
Я использую Loofah, скруббер HTMLбиблиотека, которая обертывает Nokogiri, чтобы вычистить некоторый текст HTML для отображения.Однако этот текст иногда встречается с такими вещами, как адреса электронной почты и между <
и >
символами, например, < foo@domain.com >
.Люфа рассматривает это как тег HTML или XML и удаляет его из текста.
Есть ли способ предотвратить это, в то же время выполняя хорошую работу по удалению реальных тегов?
Редактировать: Вот неудачный тестовый пример:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
require 'nokogiri'
MAGICAL_REGEXP = /<([^(?:\/|!\-\-)].*)>/
def filter_html(content)
# Current approach in a gist: We capture content enclosed in angle brackets.
# Then, we check if the excerpt right after the opening bracket is a valid HTML
# tag. If it's not, we substitute the matched content (which is the captured
# content enclosed in angle brackets) for the captured content enclosed in
# the HTML entities for the angle brackets. This does not work with nested
# HTML tags, since regular expressions are not meant for this.
content.to_s.gsub(MAGICAL_REGEXP) do |excerpt|
capture = $1
Nokogiri::HTML::ElementDescription[capture.split(/[<> ]/).first] ? excerpt : "<#{capture}>"
end
end
class HTMLTest < Test::Unit::TestCase
def setup
@raw_html = <<-EOS
<html>
<foo@bar.baz>
<p><foo@<b class="highlight">bar</b>.baz></p>
<p>
<foo@<b class="highlight">bar</b>.baz>
</p>
< don't erase this >
</html>
EOS
@filtered_html = <<-EOS
<html>
<foo@bar.baz>
<p><foo@<b class="highlight">bar</b>.baz></p>
<p>
<foo@<b class="highlight">bar</b>.baz>
</p>
< don't erase this >
</html>
EOS
end
def test_filter_html
assert_equal(@filtered_html, filter_html(@raw_html))
end
end
# Can you make this test pass?
Test::Unit::UI::Console::TestRunner.run(HTMLTest)
В настоящее время мы используем довольно злобное хакерство регулярных выражений, чтобы попытаться выполнить это, но, как говорится в комментарии выше, это не работает длятеги "вложенные" внутри не тегов.И мы действительно хотим сохранить элементы <b class="highlight">
.
В приведенном ниже примере не используется Loofah, но само приложение используется в других местах, поэтому добавить его сюда будет несложно.Мы просто не уверены, какие параметры конфигурации нам следует использовать, если таковые имеются.