作者godfat (godfat 真常)
看板Ruby
標題Re: [問題] 把 HTML 指令刪除
時間Wed Oct 3 21:23:55 2007
※ 引述《shelary (台中喵小咩)》之銘言:
: 於是我用 info.split(//u)[0..100] 去切100個字
: 可是 info 裡面已經有 HTM 語法了..去切 100 個字不旦切不準
: 而且還造成 HTML 的語法被切的不完整
: 所以我想說在顯示第一頁的那個 100 字時...先把 HTML 語法都刪掉
: 刪掉HTML後..再去切 100 個字....
: 等點選 more... 之後...才會顯示有含 HTML 的完整版
: 我的問題是....怎樣把 HTML 語法刪掉比較容易?
如果不保留 html 的話,那我目前想到的辦法還算可以處理。
剛剛在想的是,如果要保留 html 再 truncate 的話,實在不好處理,
如:
「今天是我<b>一歲</b>生日」
假設要 truncate 掉一半且保留 html, 這恐怕會變得很複雜。
或許要用純遞迴的方式才會好做,這我暫時還沒什麼好想法。
: 我想的是去尋找 < 和 > 包起來的東西....
: 但是如果使用者的自介裡有 >_< 這類的表情圖案時怎麼辦?
: 或是有更好的方法? 請教大家囉
基本上,html parsing 這種複雜到爆炸的事,最好不要自己寫,
人家是一個完整的 project, 自己寫的話會累死的 XD
要灌 tidy, 我自己電腦上是這樣灌的:
sudo port install tidy
sudo gem install tidy
本程式開始:
$KCODE = 'u'
require 'jcode' # 拿來算字數
require 'rubygems'
require 'tidy'
# 由於他不是直接把 lib 吃進去,所以要給他 .so/.dll/.dylib 的路徑:
Tidy.path = '/opt/local/lib/libtidy.dylib'
require 'open-uri' # 這滿好用的,rails 的話 open 那邊再自己改吧
msg = Tidy.open{ |tidy|
tidy.options.input_xml = true
tidy.options.output_xml = true # 這兩個要設,不然輸出會有 html header
tidy.options.input_encoding = :utf8
tidy.options.output_encoding = :utf8 # 網頁還是 utf-8 好
tidy.clean '<message>' + open('test.xml') + '</message>'
# 多加 <message></message> 是為了避免吃掉頭尾
}
require 'rexml/document'
msg = REXML::Document.new msg
words = []
def extract words, elements
if elements.kind_of? REXML::Text
words << elements.to_s # 是文字就直接儲存
elsif elements.kind_of? REXML::Element
elements.each{ |e| extract words, e } # 不是文字就要全部依序抓出來
else
raise TypeError.new('what is it? : ' + elements.inspect)
# 我不知道會不會有其他 type 的東西?
end
end
extract words, msg
puts words.join # 你要的純文字
puts words.join.jsize # 字數
如果真的要保留 html, 應該要在 elements.each 那邊動手腳,
可能要用遞迴的方式,我不是很確定,要再研究。
truncate 時也要考慮 tag 完整性,會非常複雜。
--
Nobody can take anything away from him.
Nor can anyone give anything to him.
What came from the sea,
has returned to the sea.
Chrono Cross
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.30.220
※ 編輯: godfat 來自: 220.134.30.220 (10/03 23:03)
1F:→ shelary:要保留HTML又要切是太困難了..只能把HTML全清掉再切字數 10/06 12:20