如何删除特定代码但保留允许的代码

时间:2015-09-16 12:24:44

标签: html ruby parsing nokogiri

在某些HTML中,我想删除一些特定的标签,但保留标签的内容/ HTML。例如,在下面的行中,我 要删除<strong><div>黑名单标记,但保留标记内容,并单独保留白名单标记中的<p><img>和其他标记:

原文:

<div>
    some text
    <strong>text</strong>
    <p>other text</p>
    <img src="http://example.com" />
</div>

结果:

some text
text
<p>other text</p>
<img src="http://example.com" />

我想要条带特定标签,并且不能剥离某些标签。它必须像PHP中的strip_tags一样工作。所以inner_html无法帮助我。

5 个答案:

答案 0 :(得分:4)

我会做类似的事情:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div>
    some text
    <strong>text</strong>
    <p>other text</p>
    <img src="http://example.com" />
</div>
EOT

BLACKLIST = %w[strong div]

doc.search(BLACKLIST.join(',')).each do |node|
  node.replace(node.children)
end

puts doc.to_html
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body>
# >>     some text
# >>     text
# >>     <p>other text</p>
# >>     <img src="http://example.com">
# >> 
# >> </body></html>

基本上它查找BLACKLIST中的节点并在文档中的任何位置找到它们,用节点的children替换它们,有效地将子节点提升为其父节点。

答案 1 :(得分:3)

使用Rails::Html::WhiteListSanitizer

white_list_sanitizer = Rails::Html::WhiteListSanitizer.new
original = <<EOD
<div>
     some text
     <strong>text</strong>
     <p>other text</p>
     <img src="http://example.com" />
</div>
EOD

puts white_list_sanitizer.sanitize(original, tags: %w(p img))

输出:

some text
text
<p>other text</p>
<img src="http://example.com">

答案 2 :(得分:0)

如果您只想使用Nokogiri,您可以遍历节点以递归删除所有不需要的标记:

def clean_node(node, whitelist)
  node.children.each do |n|
    clean_node(n, whitelist)
    unless whitelist.include?(n.name)
      n.before(n.children)
      n.remove
    end
  end
  node
end

def strip_tags(html, whitelist)
  whitelist += %w(text)
  node = Nokogiri::HTML(html).children.last
  clean_node(node, whitelist).inner_html
end

strip_tags功能将删除不在白名单中的所有标签。举个例子,你可以这样做:

original = <<HTML
<div>
     some text
     <strong>text</strong>
     <p>other text</p>
     <img src="http://example.com" />
</div>
HTML

puts strip_tags(original, %w(p img))

输出结果为:

 some text
 text
 <p>other text</p>
 <img src="http://example.com">

答案 3 :(得分:-1)

您可以使用xmp标记显示HTML标记。

<div>
    some text
    <strong>text</strong>
    <xmp><p>other text</p>
    <img src="http://example.com" />
    </xmp>
</div>

HTML元素“xmp”在开始和结束标记之间呈现文本,而不解释HTML。

答案 4 :(得分:-2)

如果您更喜欢使用jquery,这项任务将非常简单