如何在没有属性和标记名的情况下包装HTML文档中的单词



我有一个HTML文档,里面有很长的单词:

<div>this is a veeeeeeeeeeeerryyyyyyyyloooongwoooord<img src="/fooooooooobaaar.jof" ></div>

我想在不剪切标签或其属性的情况下对其进行文字包装:

<div>this is a veeeeeeeeeeeerryyyyy yyyloooongwoooord<img src="/fooooooooobaaar.jof" ></div>

此外,我可能根本不会有任何HTML标记。

我尝试了Nokogiri,但它在无标记输入中插入了一段,并用HTML文档包装了整个响应,这不是我的意图。

实现这一目标的最佳方法是什么?

require "Nokogiri"
class String
  def wrap()
    doc = Nokogiri::HTML(self)
    doc.at("body").traverse do |p|
      if p.is_a?(Nokogiri::XML::Text)
        input = p.content
        p.content = input.scan(/.{1,25}/).join(" ")
      end
    end
    doc.to_s # I want only the wrapped string, without the head/body stuff
  end
end

我认为使用Nokogiri::XML(self)而不是Nokogiri::HTML(self-)会对您有所帮助。

这看起来像是你的起点:

require 'nokogiri'
max_word_length = 30
html = '<div>this is a veeeeeeeeeeeerryyyyyyyyloooongwoooord<img src="/fooooooooobaaar.jof" ></div>'
doc = Nokogiri::HTML.fragment(html)
doc.search('text()').each do |n|
  n.content = n.content.split(' ').map { |l|
    if (l.size > max_word_length)
      l = l.scan(/.{1,#{ max_word_length }}/).join("n")
    end
    l
  }.join(' ')
end
puts doc.to_html
# >> <div>this is a veeeeeeeeeeeerryyyyyyyyloooong
# >> woooord<img src="/fooooooooobaaar.jof">
# >> </div>

相关内容

最新更新