Nokogiri替换标签值

时间:2010-02-11 13:01:17

标签: xhtml data-structures string nokogiri

如何将“foo”替换为“bar”?

<h1>foo1<p>foo2<a href="foo3.com">foo4</a>foo5</p>foo6</h1>

<h1>bar1<p>bar2<a href="foo3.com">bar4</a>bar5</p>bar6</h1>

我只想替换标签内部内容,没有标签属性。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::HTML(DATA)

doc.xpath('//text()').each {|foo|
  dummy = foo.add_previous_sibling(Nokogiri::XML::Node.new("dummy", doc))
  dummy.add_previous_sibling(Nokogiri::XML::Text.new(foo.to_s.gsub(/foo/, "bar"), doc))
  foo.remove
  dummy.remove
}
puts doc

__END__
<h1>foo1<p>foo2<a href="foo3.com">foo4</a>foo5</p>foo6</h1>

我原以为foo.inner_html.gsub!(/foo/, "bar")有效,或者foo.inner_html = foo.inner_html.gsub(/foo/, "bar"),但事实并非如此 虚节点是使新文本节点与旧文本节点保持一致。

答案 1 :(得分:2)

我能做到

nokogiri_doc.css('p').each { |p| p.inner_html = p.inner_html.gsub(/\n/, "<br/>") }

将p tag内所有出现的\ n替换为br标记