2011-06-14 47 views
0

我有了很長的話一個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 
+1

這將幫助,如果你表現出你第一次寫的代碼。這給了我們一些開始。 – 2011-06-14 08:47:40

+0

新增了我的源代碼 – astropanic 2011-06-14 09:24:16

回答

0

我認爲使用Nokogiri :: XML(self)而不是Nokogiri :: HTML(self)會幫助你。

+0

如果它是真正的HTML,則不行。對於XML,Nokogiri使用更嚴格的解析器而不是HTML。 – 2011-06-15 04:03:10

+0

@ the-Tin-Man是的,這是正確的...如果您在源代碼中有htmlentities,則 – 2011-06-15 08:57:57

0

這看起來像一個起點你:

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> 
+0

不起作用,例如­ – astropanic 2011-06-15 08:16:16

+0

然後先處理它們。這不是罐裝解決方案,而是一個起點。 – 2011-06-15 08:52:15

相關問題