• ベストアンサー

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

現在、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 =~ /^<.*>/) の後に改行コードを入れたいのですがどうすれば入れれますか?

noname#236785
noname#236785
  • Perl
  • 回答数5
  • ありがとう数4

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

  • ベストアンサー
回答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

  • 改行を行わない書き込みメソッド

    Rubyを使用しています。 いま,f = File.open(・・・)として, そこにある変数a, b, c, ・・・を同じ行に入力してしようとしています。 そこで,ary = [a, b, c, ・・・]という配列を作成し, f.puts ary と書いててみたのですが上手に行きません。 というのも,putsでは自動的に改行されてしまって, a,b,c・・・がそれぞれ別の行に入力されてしまうためです。 改行を行わずに書き込みを行う方法を教えていただけないでしょうか? お願いします。

  • C言語での改行コードの扱いについて教えてください。

    改行コードは一般的に、 Windows・・・「CR+LF」 UNIX or Linux・・・「LF」 だと思うのですが、改行コードが「LF」のファイルをWindows上で、C言語で編集したらどういった改行コードになるのでしょうか。 (例えば、単純にファイルを1レコードずつ読み込んで別ファイルに書き込むといった処理) 出力時に「CR+LF」になってくるのでしょうか?それともまったく別のものになってしまうのでしょうか? 詳しい方、ぜひ教えてください。 ※改行コード「LF」のテキストファイルは、UNIXサーバから「HULFT」というファイル転送ソフトの「バイナリ転送モード」でWindowsサーバに送られてくる予定です。

  • カンマを改行に変換する方法

    テキストファイルの中にあるカンマ(,)を改行に変換する方法を教えてください。 具体的には次のようなCSVファイルがあります。 A,B C,D E,F これを A B C D E F と変換したいのです。 EXCELを使ってもかまいません。よろしくおねがいします。

  • ifの中に改行とコメントを書いてもよいか

    C++のソースでifの中に改行とコメントを if( a == 0 || // comento b == 0 // comento ){} のように書いてもよいですか?

  • スクリプトファイル編集について

    ファイル編集について勉強なのですがどうしてもできません。 複数ファイル内よりIF構文を見つけてFILE_A.txtのIF書式へ変換する。 ※編集前にFILE_B.txtの変更箇所をコメント化して編集後に変換、 FILE_A.txtの書式であれば編集しない処理を作りたいと思うのですが・・・ FILE_A.txt if [ $? != 0 ] ; then   echo "てすと" fi 編集前 FILE_B.txt -- if [ -f $file ] then   echo "てすと" fi 編集後 FILE_B.txt -- #if [ -f $file ] #then if [ -f $file ] ; then   echo "てすと" fi 以上よろしくおねがいします。

  • 複数存在するgrepについて

    自分はSolaris7(8)を使用しているのですが、grepが /bin/grep /usr/bin/grep /usr/xpg4/bin/grep の3つ存在しています。動作的には前者2つが同じようで、最後者がちょっと拡張されているように思われます。思うに大きな違いは"-f|-e"(ファイルにマッチすべき文字列を書いておくことが出来る)が大きいと思うのですが、そこで、 1) /xpg4 というdirectoryはどのような意味合いを持っているのでしょうか?どのような括りでこのディレクトリがあるのでしょうか? 2) 上に書いたオプションの違いのほかに、両者にはどのような違いが有るのでしょうか? 3) 通常、UNIXのユーザーは/usr/bin/grepがデフォルトで使っているというのが「正しい」と思うのですが、後者(xpg4)がデフォルトとして使われる場合にはどのようなケースがあるのでしょうか? --[参考]-- /usr/bin/grep [ -bchilnsvw ] limited-regular-expression [filename ... ] /usr/xpg4/bin/grep [-E | -F ] [-c | -l | -q ] [ -bhinsvwx ] -e pattern_list ... [ -f pattern_file ... ] [ file ... ] ---------- 宜しくお願いいたします。

  • jsp 改行コードで改行させて表示したい

    はじめまして。 PostgreSQLから読み込んだ文字列データを表示させるtomcat+struts+servlet/jspを作成中です。 データの文字列に含まれる改行が、クライアントに表示された際に反映されず困っています。 過去ログも調べ、近い質問はありましたが、僕とは内容が微妙に違うようで、改めて質問させていただきました。 例えば、あるテーブルのある項目に、 A B C というデータ(A,Bそれぞれの後に改行のある3行の文字列)があるとします。 これを読み込みaction form bean(と言うのですか?setter/getterを定義する関数です)を介してjspに埋め込むと、できあがるhtmlでは、 ABC と改行されずに表示されます。 htmlで改行させるには「<BR>」が必要なのかと、データ文字列に0x0dや0x0a、または0x0d+0x0aがあれば「<BR>」に置き換えてaction form bean(?)のsetterに渡してjspを作ると、今度は、 A<BR>B<BR>C と「<BR>」が文字列として表示されます。 htmlをソース表示すると、「A&lt;BR&gt;B&lt;BR&gt;C」で、親切にも「<」「>」をそれぞれ「&lt;」「&gt;」に勝手に置き換えあくまで文字列として表示してくれるようです。 試しに改行コードを「&lt;BR&gt;」に置き換えても予想通りその部分は &lt;BR&gt; とそのまま表示され、そのソースは「&amp;lt;BR&amp;gt;」でした。 「<」や「&lt;」等をそれぞれ「&lt;」「&amp;lt;」のように置き換える作業は、どこが行っているのでしょうか。 また、改行位置で改行させるにはどうすればよろしいでしょう。 OSはwindowsXPです。 無知ゆえに、つまらないことで悪戦苦闘しているのかも知れませんが、経験も浅くてよく解りません。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • CSV取り込み処理時の改行

    CSVファイルをファイル参照タグで取り込みデータを流す処理を作成したいのですが、 CSVファイル内の入力項目に改行が含まれていたらうまく取り込めません。 どうしたら正しく取り込めるのでしょうか? ※補足 $tmp_file = file($_FILES['csv']['tmp_name']); ↑のようにfile関数で取り込んだ場合、 $tmp_file[1]につきファイル1行が格納したのですが、 ファイル内改行箇所で$tmp_file内も改行され、ファイル内1行情報が2行となって$tmp_fileに入ってしまう。

    • ベストアンサー
    • PHP
  • WindowsでのOpenssl使用方法

    WindowsのOpensslを http://slproweb.com/products/Win32OpenSSL.html からOpensslのバイナリを取得し 実行しましたが、WARNINGが表示されてしまいます。 どのファイルを修正すれば、WARNINGが表示されなくなるのでしょうか? C:\OpenSSL-Win64\bin>openssl.exe sha256 C:\Users\shin\Documents\sha.txt WARNING: can't open config file: /usr/local/ssl/openssl.cnf SHA256(C:\Users\shin\Documents\sha.txt)= 9f86d081884c7d659a2feaa0c55ad015a3bf4f1 b2b0b822cd15d6c15b0f00a08

  • 【ruby】flockで掛けたロックを参照したい

    複数プロセス間で、一つのファイルに対して読み書きしたいです。 その際、ファイルへの書き込み中は、ファイルの読み込みを抑止したいです。 また、読み込みの処理はファイルのロックを参照するだけで、ファイルへのロックは掛けない様にしたいです。 そこで、以下二つプログラムを作成して、簡単な検証を行いました。 ■プログラム1 キーボードからの入力があるまで、ファイルをロックする。 #!/usr/local/bin/ruby file='./hoge.txt' f=open(file,'r+') ret=f.flock(File::LOCK_EX|File::LOCK_NB) STDOUT.write 'Hit any key' STDIN.gets.chomp ■プログラム2 ファイルがロックされているか状態を取得する。 #!/usr/local/bin/ruby require "fcntl" file='./hoge.txt' f=open(file,'r') arg="" f.fcntl(Fcntl::F_GETLK,arg) l_start,l_len,l_pid,l_type,l_whence = arg.unpack('VVVSS') puts l_len ※プログラム2は、fcntlの使い方がマニュアルを読んでもよく理解できなかったので、 手探りで記述しました。 実行すると、プログラム1はエラー無く動きましたが、プログラム2は以下の様なエラーが 出てしまいます。 fcntl.rb:6:in `fcntl': Invalid argument - ./hoge.txt (Errno::EINVAL) from fcntl.rb:6 環境は、unixレンタルサーバ(FreeBSD)です。 上記方法では、上手くいきませんでした。 flockでファイルにロックが掛っているか否かを、そのファイルにロックを掛けることなく 調べるにはどうしたら良いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう