2010-02-11 57 views
2

如何將「foo」替換爲「bar」?Nokogiri替換標籤值

<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
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"),但事實並非如此。
虛擬節點將使新文本節點與舊文本節點保持一致。

+0

尼斯,聰明的形式給出了 – astropanic 2010-02-25 12:38:07

2

我能做

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

要更換p標籤內的\ n所有ocurrences爲BR標籤

+0

這工作是更優雅。 – 2016-03-17 04:31:01