【问题标题】:Wrap specific text with link Nokogiri使用链接 Nokogiri 包裹特定文本
【发布时间】:2013-04-09 21:58:59
【问题描述】:

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

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

我想改成什么

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

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

【问题讨论】:

    标签: ruby-on-rails ruby nokogiri


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

    【讨论】:

    • 谢谢,但node.to_html 将链接返回为&amp;lt;a href 有没有办法不将其转换为 html 实体?
    • @Hengjie 你是对的,我刚刚修复了它。由于&lt;a&gt;是一个节点,所以需要创建它并将它添加到文本之前的节点span。
    • 感谢@toch,但如果我们简单地使用 gsub 结果设置 node.inner_html 也可以吗?还是会产生意想不到的后果?
    • @Hengjie 好问题。同样,您是对的,在我们的案例中它可以正常工作。但是当你需要添加一个子节点时,它并不是最好的(参见我在底部的解释)。
    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2014-07-08
    相关资源
    最近更新 更多