0

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

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

我想改成哪个

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

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

4

1 回答 1

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=并不是最好的,因为它会删除所有子节点。因为它删除了所有节点子节点,所以它不是性能方面的最佳选择,当您只需要添加一个节点子节点时。

于 2013-04-09T11:21:06.933 回答