2013-04-09 2 views
0

Я использую 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

Явно создание и добавление нового узла

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= не самый лучший, поскольку он удаляет все дочерние узлы. Поскольку он удаляет все дочерние узлы, это не лучший выбор с точки зрения производительности, когда вам нужно просто добавить дочерний узел.

+0

Спасибо, но 'node.to_html' возвращает ссылку как' < a href' есть способ не преобразовать ее в html-объекты? – Hengjie

+1

Спасибо @toch, но будет ли он работать, если мы просто установим node.inner_html с результатом gsub? Или есть неожиданные последствия? – Hengjie