HTML Chunker

コメントとタグを分けたくて正規表現を使っていたら,* のマッチがある程度以上長いときに処理が帰ってこないことがあったので,簡単にパーザを書いた。正規表現使っていないのに scan より遅いのは,再帰が C レベルか Ruby レベルかが効いているのかな。

def rb_parse_html str
   ary = Array.new
   tag = false
   bp = ep = 0
   while ep = str.index(tag ? ">" : "<", bp) do
      ep += 1 if tag
      ary.push [tag, str[bp, ep - bp]] if ep > bp
      tag = ! tag
      bp = ep
   end
   ary.push [tag, str[bp, str.size - bp]] if bp < str.size
   return ary
end