2010-02-11 17 views
2

Comment remplacer "foo" par "bar"?Nokogiri remplace les valeurs des étiquettes

De

<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> 

Je veux remplacer uniquement le contenu intérieur de l'étiquette, sans attributs de balise.

Toutes les idées?

Répondre

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> 

je l'aurais pensé foo.inner_html.gsub!(/foo/, "bar") œuvres ou foo.inner_html = foo.inner_html.gsub(/foo/, "bar") peut-être, mais il ne fonctionne pas.
Le noeud fictif doit conserver le nouveau noeud de texte qui ne fait plus qu'un avec l'ancien noeud de texte.

+0

Nice, Aproach intelligent – astropanic

2

que je pouvais faire

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

Pour remplacer toutes les ocurrences de \ n à l'intérieur balise p br à des tags

+0

Cela fonctionne et est beaucoup plus élégant. –