用链接Nokogiri包装特定文本

时间:2013-04-09 11:06:10

标签: ruby-on-rails ruby nokogiri

我正在使用Nokogiri并且无法弄清楚如何使用我提供的链接包装特定单词。

我有<span class="blah">XSS Attack document</span>

我想改成

<span class="blah"><a href="http://blah.com">XSS</a> Attack document</span>

我知道Nokogiri中有一个.wrap(),但它似乎无法仅包装特定的XSS文本。

1 个答案:

答案 0 :(得分:1)

明确创建和添加新节点

require 'nokogiri'

text = '<html> <body> <div> <span class="blah">XSS Attack document</span> </div> </body> </html>'
html = Nokogiri::HTML(text)

# get the node span
node = html.at_xpath('//span[@class="blah"]')
# change its text content
node.content = node.content.gsub('XSS', '')

# create a node <a>
link = Nokogiri::XML::Node.new('a', html)
link['href'] = 'http://blah.com'
link.content = 'XSS'

# add it before the text
node.children.first.add_previous_sibling(link)

# print it
puts html.to_html

使用inner_html=

require 'nokogiri'

text = '<html> <body> <div> <span class="blah">XSS Attack document</span> </div> </body> </html>'
html = Nokogiri::HTML(text)

node = html.at_xpath('//span[@class="blah"]')
node.inner_html = node.content.gsub('XSS', '<a href="http://blah.com">XSS</a>')

puts html.to_html

在我们的案例中,两种解决方案都可以。但是当遍历节点树时,inner_html=不是最好的,因为它删除了所有子节点。因为它删除了所有节点子节点,所以当你需要添加节点子节点时,它不是性能方面的最佳选择。