• 締切済み

HTMLをパースしたい

こんにちわ ActionScriptでHTMLをパースしてHTML要素を追加したり、削除したりしたいのですが、HTMLをパースできるクラスが見つかりません。(ないような気がします。)XMLをパースするクラスがあったのですが、XMLでHTMLをパースをパースすると<br>等終了タグがない要素でエラーが出てしまいます。 というような状況で、HTMLをパースする方法、またよい代替案をご存知のかた、ぜひご伝授していただけますでしょうか?よろしくお願いいたします。

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 面倒だと言われますと,それ以上書きようがありませんから,それに関しての回答は控えます。 正規表現は ActionScript3.0 (Flash CS3 Professional)から使えますが, ActionScript2.0 では普通は無理です。 しかし調べてみると ActionScript2.0 でもそういうクラスファイルが配布されているようです。 ご存じだったかもしれませんが一応参考まで。 http://www.google.co.jp/search?hl=ja&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE+ActionScript2.0

hasekyou
質問者

お礼

ありがとうございました

すると、全ての回答が全文表示されます。
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

HTML 内を見て,「文字列を抜き出す・抽出する」くらいでしたら Flash のみでできると思います。 しかし, > HTML要素を追加したり、削除したり これはどういう意味でしょうか? 1 HTML 自体を書き替えるということでしょうか? それでしたら Flash では無理です。 2 単に抜きだしたものをFlash内で加工するという意味でしょうか? それでしたら Flash でも工夫すれば可能だと思います。 1のHTML を書き替えるということでしたら見た目上だけは,JavaScript で可能です。 例えば今ご覧になっているこのページを閲覧した状態で, 上のアドレスの欄にある http://~ を消して, javascript:document.body.innerHTML=document.body.innerHTML.split('。').join('ぞ~!!');focus(); ↑これを貼り付けてもらって,Enterキーを押せば, このページの文章が全体的に力説したものに変わると思います。 これに近い物を JavaSuript の function 内に作成し, ActionScriptからその function を実行すれば可能かもしれません。 しかし加工した物を保存するとなると JavaScript でも無理で,PHP などサーバ言語が必要になります。 とにかく, 「HTML要素を追加したり、削除したり」 の正確な意味がわからないので, 誰もちゃんとは回答できないと思います。 ==================== 2の「単に抜きだしたものをFlash内で加工する」場合について, 簡単な例を書いておきます。 「my_flash.swf」 が同じ階層にある 「my_flash.html」 に貼りついているとします。   任意のフォルダ    ├ my_flash.html (my_flash.swf が貼りついている)    └ my_flash.swf その「my_flash.html」の <title>~</title> 間を, 「my_flash.swf」から抜きだして適当に文字装飾する例です。 Flash で新規ドキュメントを作成し, 「my_flash.fla」 というファイル名で任意のフォルダに保存します。 そして,フレーム1 に次のようなスクリプトを書きます(コピペします)。 ////////////////////////////////////////////////////////// // HTML を Shift-JIS として扱う System.useCodepage = true; // タイトルの後に入れる文字列を指定 mes = " だよぉ~ん (⌒~⌒)ニンマリ"; // テキストフィールド my_txt を作成 _root.createTextField("my_txt", 0, 20, 20, 350, 30); // myLV という LoadVars クラスのインスタンスを作成 myLV = new LoadVars(); // myLV にデータが読み込まれたときの動作定義 myLV.onData = function(my_dat) { my_txt.text = my_dat.split("<title>")[1].split("</title>")[0]+mes; }; myLV.load("my_flash.html"); ////////////////////////////////////////////////////////// (↑ActionScript1.0,FlashMX 以上(FlashPlayer6以上) で使用可能) これで出来上がりです。 SWF と HTML をパブリッシュすれば動作確認できます。 HTML のタイトルをテキストエディタなどで書き替えて保存し, また開けば Flash に表示されるタイトルも変わると思います。 上の例では, ごちゃごちゃと物を用意するのが面倒なので, SWF の貼りついている HTML のタイトルを表示させただけです。 SWF が貼りついていない他の HTML でも, 同じサーバで ,同じドメイン内にある HTML なら同様に表示できます。 my_txt.text = my_dat.split("<title>")[1].split("</title>")[0]+mes; この行の my_dat.split("<title>")[1].split("</title>")[0]; についてのみ説明します。 これは, my_dat(ロードされたHTML全体)を <title> で2分した配列を作成し, その配列の エレメント1(2分した後側の要素) をさらに </title> で2分した配列を作成し, その配列の エレメント0(2分した前側の要素) を取得するという意味です。 (配列のエレメントは 0 番が最初のエレメントです。) 流れを図示すると次のような感じです。  …○○○<title>△△△</title>□□□… ←my_dat(HTML)    ↓split("<title>")  …○○○  |  △△△</title>□□□…    ↓[1]  △△△</title>□□□…    ↓split("</title>")  △△△  |  □□□…    ↓[0]  △△△ これで <title>~</title> 間の △△△ が取りだせます。 <title>~</title> は HTML 内に普通は1つしかありませんから簡単です。 他のものの場合は難しいですが, タグに固有の属性を付けるなど HTML に工夫をすれば,なんとか取得できると思います。 上のものは私が今考えてみただけのものです。 したがって同様の方法を解説しているようなサイトは知りません。 ヘルプぐらいが提示できる参考URLです↓。 Flashドキュメンテーション より 「LoadVars を使用したテキストのロードと表示」 http://livedocs.adobe.com/flash/8_jp/main/00001425.html 「split (String.split メソッド)」 http://livedocs.adobe.com/flash/8_jp/main/00002705.html ==================== 最初に書きましたように, ご質問内容がはっきりつかめません(どうとでも取れる)ので, これで良いのか悪いのかはわかりません。 これで悪い場合は補足してください。 私が回答できるかどうかはわかりませんが。

hasekyou
質問者

お礼

ご丁寧に回答して下さいましてありがとうございます。 質問の内容がわかりにくかったんでしょうか。。。 目的は、「HTMLのソースに対していろいろ文字列処理をしたいことです。」 やり方としては、以下の二つの方法があると思います。1に比べて明らかに2の方が簡単なので、【HTMLをパースする方法を探しているところです。】 1.BlurFiltanさんがお書きになったStringクラスで定義されているメソッドを使う方法(正規表現も含みます。) 2.HTMLをパースしてDOMオブジェクトに変換する方法 また、「HTML要素を追加したり、削除したりする」の例を挙げておきます。以下の例では、Stringクラスのメソッドだけでも勿論できますが、かなり面倒です。【もしHTMLをDOMに変換できればかなり楽なのです。】 ----------変更前のHTML--------- <tr class="hogehoge"> <td>変更前のTD値1</td> <td>変更後のTD値2</td> </tr> <tr class="aaaaaa"> <td>td value1</td> <td>td value2 </tr> ----------以下のHTMLに変更したい---------- TRのclass属性がhogehogeの場合のみ、子要素のtdの値を変更する <tr class="hogehoge"> <td>変更後のTD値1</td> <td>変更後のTD値2</td> </tr> <tr class="aaaaaa"> <td>td value1</td> <td>td value2 </tr>

すると、全ての回答が全文表示されます。

関連するQ&A