作者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