使用Nokogiri

时间:2016-07-19 14:12:48

标签: html css ruby nokogiri

如何在具有不同类的任何元素上替换文档中出现的CSS类的所有实例?

在任何元素上都可能有其他类,在这种情况下,它们应保持不变。

如果班级名称是' foo'而且我想用' bar'取而代之,我实际上想要来自:

<div class"foo">
 <span class="foo omega"></span>
 <span class="alpha foo omega"></span>
</div>

要:

<div class"bar">
 <span class="bar omega"></span>
 <span class="alpha bar omega"></span>
</div>

我知道我可以遍历所有元素并对css属性进行替换,但这感觉很笨拙。

1 个答案:

答案 0 :(得分:0)

默想:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class"foo">
 <span class="foo omega"></span>
 <span class="alpha foo omega"></span>
</div>
EOT

foo_spans = doc.search('.foo') # => [#<Nokogiri::XML::Element:0x3fe532115b14 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fe532115a60 name="class" value="foo omega">]>, #<Nokogiri::XML::Element:0x3fe532115380 name="span" attributes=[#<Nokogiri::XML::Attr:0x3fe5321152e0 name="class" value="alpha foo omega">]>]
foo_spans.each do |n|
  n['class'] = n['class'].gsub(/\bfoo\b/, 'bar')
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>
# >> <div class>
# >>  <span class="bar omega"></span>
# >>  <span class="alpha bar omega"></span>
# >> </div>
# >> </body></html>