From: kai13@... Date: 2001-02-22T19:56:49+09:00 Subject: [ruby-list:28148] Re: 正規表現で の認識 On Tue, 20 Feb 2001 21:04:35 +0900 MoonWolf wrote: > スキャナジェネレータtlex([ruby-list:28062])のアーカイブにhtmlscan.rlとい > うHTMLのスキャナが入ってます。これじゃ駄目? > > 使い方: > $ ruby tlex.rb htmlscan.rl htmlscan.rb > $ ruby htmlscan.rb < simpile0.html > 採用しようと思ったのですが、タグのプロパティがまだ出来てないようなので また次の機会にします。 On Tue, 20 Feb 2001 11:56:15 +0900 gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) wrote: > ごとけんです > > In message "[ruby-list:28078] 正規表現で の認識" > on 01/02/20, kai13@basil.freemail.ne.jp writes: > >Tree型htmlパーザーを開発していてるのですが、 > >サンプルファイル:http://tat6.ice.ous.ac.jp/akita/filez/simple0.html > > > >のコメントの検出に失敗します。 > > 問題点は数箇所ありそうですが、構造的な問題は、 > > >def parse_html(file) > > post_match = '' > > open(file) {|file| > > while line = file.gets('>') > > ここにあります。正規表現でタグ全体をマッチさせたいなら">" ま > でを読めばよいわけではないでしょう。もし、入力をちょこっとず > つ読みたければ、トークン単位で動作するような構文解析器をつく > るよりほかは無いと思います。 > > もし入力を一気に読みきっても良いならばつぎのような正規表現が > 使えます。 > > HTMLPAT = / () # comment > | (<(?:\s|[^>])+>) # tag > | ((?:[^<>]|\s)+) # text > /mx > > こんな感じで使います: > > require "kconv" > $KCODE = "EUC" > Kconv.toeuc(ARGF.read||"").scan(HTMLPAT){|cmt,tag,txt| > p [cmt,tag,txt] > } 結局、パーザに入力する前にコメントなら追加して入力することにしました。 これはコメントだけが、1文字以上で終了するからです。他は '>' で十分。 while line = file.gets('>') if /)/ =~ line until /-->/ =~ line line << file.gets('>') end end #p line until line.empty? -- 秋田(Akita) kai13@basil.freemail.ne.jp