• ベストアンサー

改行コードの挿入について[タグチェッカー]

現在、UNIXでhtmlタグのチェッカーを作っています。 たとえば、 <a><b> <c> というhtmlファイルがあるとします。(<a>,<b>,<c>などのタグがあるとする) これを配列に <a> <b> <c> という風に入れたいのですが、現在は #!/usr/bin/perl @allfile = (); open(f, "test.html"); while($file = <f>){     chomp $file;     if ($file =~ /^<.*>/){ # allfileにタグを1つずつ格納する         @allfile = (@allfile,$file);     } } close(f); としていてif ($file =~ /^<.*>/) の後に改行コードを入れたいのですがどうすれば入れれますか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>htmlタグのチェッカー と言う事ですから 例: あ、、<B>そういえば<a HREF= "./hero.htm">ここに</A>書いてあったけど</B> なんて場合に @allfileの内容が ("<B>\n","<a HREF=\"./hero.htm\">\n","</A>\n","</B>\n") になれば良いてことですか? そうだとしたら まず、改行以前にパターンマッチがおかしいですね このままだと 1. 行頭が < で始まっていないとマッチしない 2. 1行に複数のタグがあっても 1回のパターンマッチしか行われない 3.   同上    一つの配列要素にそのまま入ってしまう 4. 例 のような複数行に切れているタグはどうするの? サンプルとして 変数に入った1行の文字列から タグ1個づつに切り分ける方法を書いておきます ##### HTMLタグ切り分けTEST $test = 'aaa<A href="test.htm">bbb<B>ccc</B>ddd</A>eee"aaa"<pre><H1></H1></pre>'; while($test =~s/<[^>]*>//) {@allfile = (@allfile ,$&."\n");} ##試しに表示する foreach(@allfile) {print "$_ \n=============\n";} ##スクリプトサンプルは以上 あと 上記 4.のような場合を考えると 配列の末尾に \n をつけるより 複数行に 分かれてしまっているタグも改行コードごと配列に読み込んで HTML文の判定部分で 改行が含まれていたら 「タグが複数行に分かれています」みたいな警告を出すようにしたらいいんじゃないかと思います って? あれ? そういうのってRFC的にまずいんんだよね? どうも疎くて>RFC

noname#236785
質問者

お礼

遅れましたが、ご回答ありがとうございます。 お礼が遅れましたが、結果的にumasikajiroさんのアドバイスを参考にプログラムを作りました。 質問時はまだ初歩の段階で躓いていたもので、プログラムの全体像などを説明できておりませんでした。次回質問する際には気をつけます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

あ, #3 のマッチはやっぱり m/<.*?>/sg と s を入れないとダメだった.

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

多分、タグの閉じ記号の後ろに改行を入れたいのだとしたら $file =~ s/>/>\n/g; というようなことだと思うのですがどうでしょうか? ただ、質問に「HTMLチェッカー」としている割に対象となっているデータがシンプル過ぎて、このお題目があるためにまったく別の疑問が沸いてきてしまいます。 たとえば ・データが一行に「<a><b><b><b><c><c><a>」のような場合どうなってほしいのか。 ・HTMLには閉じタグがあるものとないものがあるがそれらの処理はどうするのか? ・ANo.3さんが指摘しているようにタグが複数行にまたがる場合 ・改行で何がしたいのか。 ・改行以前にこの処理で配列に正常格納されるのか。 努力の跡はうかがえるのですが・・・。

noname#236785
質問者

お礼

遅れましたが、ご回答ありがとうございます。 「タグが複数行にまたがる」場合は無視して作っています。 また、データが一行に「<a><b><b><b><c><c><a>」のような場合は配列に<a>,<b>,<b>,...,<a>という風に入れたかったのですが、こちらで解決いたしました。ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

なんというか, 主に #2 向けかも (苦笑). 「メモリが十分にある」という前提を付けていいなら $/ = undef; $file = <>; @tags = ($file =~ /<.*?>/g); で @tags に「タグの配列」が得られる, ような気がします. あとは煮るなり焼くなりお好みで. ちなみに「タグが複数行にまたがる」ことは当然ありえます.

noname#236785
質問者

お礼

ご回答ありがとうございます。 すいません、こちらの説明不足で。。 「タグが複数行にまたがる」場合は無視して作っています。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「if ($file =~ /^<.*>/) の後に改行コードを入れたい」って, どういう意味なんでしょうか? 文字通りに解釈すると if ($file =~ /^<.*>/) { それ } という形でいいってことになるけど, そうじゃないんですよね. 1.出力するときに, 各タグのあとに改行を入れたい 2.配列に入れるときに, 各タグのあとに改行を入れたい 3.その他 のどれでしょうか?

関連するQ&A

専門家に質問してみよう