我正在使用Nokogiri
并且无法弄清楚如何使用我提供的链接包装特定单词。
我有<span class="blah">XSS Attack document</span>
我想改成
<span class="blah"><a href="http://blah.com">XSS</a> Attack document</span>
我知道Nokogiri中有一个.wrap()
,但它似乎无法仅包装特定的XSS
文本。
答案 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=
不是最好的,因为它删除了所有子节点。因为它删除了所有节点子节点,所以当你需要添加节点子节点时,它不是性能方面的最佳选择。