仅替换HTML字符串中的原始文本

时间:2015-01-14 08:00:35

标签: html ruby

我有一个字符串:

html_string =
'<span><span class=\"ip\"></span> Do not stare <span class=\"img\"></span>  at the monitor continuously </span>\r\n'

我想将s的原始文本(不在html代码中)中的字符html_string替换为<span class="highlighted">s</span>

结果应为:

'<span><span class=\"ip\"></span> Do not <span class="highlighted">s</span>tare <span class=\"img\"></span>  at the monitor continuou<span class="highlighted">s</span>ly </span>\r\n'

我做的是:

html_string.gsub(/s/, '<span class="highlighted">s</span>')

但是,无论原始文本或标记如何,这都会替换所有s字符。我想替换它跳过html标签及其属性。怎么做?

2 个答案:

答案 0 :(得分:3)

不要假装是理想的答案,只是为了给你一个去的地方:

require 'nokogiri'

html_string = '<span><span class="ip"></span> Do not stare <span class="img"></span>  at the monitor continuously </span>'
doc = Nokogiri::HTML.fragment(html_string)
spans = doc.css('span')
spans.each do |span|
  span.xpath('text()').each do |text|
    if text.content =~ /stare/
      text.content = text.content.sub(/stare/, '<span class="highlighted">s</span>tare')
    end
  end
end
p doc.to_html.gsub(/\&lt;/, '<').gsub(/\&gt;/, '>')

哪个输出是:

#=> "<span><span class=\"ip\"></span> Do not <span class=\"highlighted\">s</span>tare <span class=\"img\"></span>  at the monitor continuously </span>"

所以,我们在这里寻找所有span并检查它们是否有stare字的内容。然后我们改变内容。这就是全部,并学习nokogiri。

答案 1 :(得分:1)

这很简单:解析html,替换文本节点,打印到html。

Nokogiri似乎在Ruby中很受欢迎。