Nokogiri заменить значения тега - PullRequest
2 голосов
/ 11 февраля 2010

Как заменить "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 ]

2 голосов
/ 06 сентября 2010

Я мог бы сделать

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

Чтобы заменить все вхождения \ n внутри тега p на теги br

2 голосов
/ 20 февраля 2010
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"), но это не так.
Пустой узел должен сохранять новый текстовый узел единым со старым текстовым узлом.

...