您的位置:首页 > 其它

ava线程 同步与异步 线程池

2011-04-24 17:50 162 查看
参考文献: http://mikeburnscoder.wordpress.com/2006/11/11/truncating-html-in-ruby/
这里不使用hpricot,而是使用ruby自己带的库rexml中的pullparser
将文件取名为string.rb,并放到rails项目的lib目录下,当然也可以根据需要,改写成helper(我就是这么做的)。
require 'rexml/parsers/pullparser'

class String
def truncate_html(len = 30)
p = REXML::Parsers::PullParser.new(self)
tags = []
new_len = len
results = ''
while p.has_next? && new_len > 0
p_e = p.pull
case p_e.event_type
when :start_element
tags.push p_e[0]
results << "<#{tags.last} #{attrs_to_s(p_e[1])}>"
when :end_element
results << "</#{tags.pop}>"
when :text
results << p_e[0].first(new_len)
new_len -= p_e[0].length
else
results << "<!-- #{p_e.inspect} -->"
end
end
tags.reverse.each do |tag|
results << "</#{tag}>"
end
results
end

private

def attrs_to_s(attrs)
if attrs.empty?
''
else
attrs.to_a.map { |attr| %{#{attr[0]}="#{attr[1]}"} }.join(' ')
end
end
end

1、首先使用html格式字符串初始化PullParser:
p = REXML::Parsers::PullParser.new(self)

2、然后使用pull函数每次获取一个元素:
e = p.pull

假设字符串为:
str = '<div id="head">some text<h1>head</h1></div>'

那么上面的语句返回一个对象e,其中
e.event_type = :start_element
e[0] = 'div'
e[1] = {"id" => "head"} # 一个保存tag属性的hash

3、再次执行
e = p.pull

那么就会返回一个
e.event_type = :text
的对象。
4、空白和中文字符长度处理
如果要去除字符串的空白,使用:
string.strip

如果要获取包含中文字符的字符串的字符长度(非字节长度),使用:
string.split(//).length
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: