HTMLには文字の装飾などのためにタグと呼ばれる表示されない情報が存在します。そのための一部の文字を特殊文字と呼び、その文字を表示したいときは特別な文字列によって置き換えます。HTMLの特殊文字の一般的な物は次の4つで、右側の文字列で置き換えます。 & : & " : " < : < > : >この中でダブル・クォート(")は、HTML 3.2からそのまま使えるようになったようです。 これから作成するPerlのプログラムでも、それにならって"は置換しない事にします。 そうすると入力ファイル中の&,<,>をそれを意味する文字列に置き換えれば良い事になります。単純に置き換えるだけだと、入力ファイルにHTMLのタグが入っているとき置換してはいけないタグの<が置き換えられてしまいます。置き換える物と置き換えたくない物をプログラムでうまく判断する事は出来るでしょうか。 タグを判断してタグだったら置換しないようにしたらどうでしょうか。もし、「HTMLの書き方」みたいなページでタグの例を示している場合、実際のタグと例として表示したいタグの区別は付けられません。入力ファイルはHTMLのタグの入っていないテキストファイルに限定しましょう。 さらに、このプログラムで置換したテキストをまたこのプログラムにかけると、置き換えられた文字列の先頭の&を、また置き換えてしまいます。 はじめのファイルにある<が、1回目の置換で<となって、2回目の置換で&が置き換えられ&lt;になってしまいます。<などの文字列を判断して置換しないようにすると、<と表示したい場合に&が置換されないで表示が<になってしまいます。 これは、&の置換をやめるか、そういう使い方を禁止するかのどちらかで対応するしかなさそうです。 &の置換をやめると&を手作業で処理する事になり意味がなくなってしまいます。このプログラムの出力をこのプログラムに入力してはいけないという事にしましょう。 # テキストファイルのHTMLの特殊文字(&,<,>)を置換する # 入力ファイルはHTMLのタグを含んでいない事 # 置換後のファイルをもう1度かけてはいけない # Hirose 99.1 # 入力・出力ファイル名 $ifile = "perl02.txt"; $ofile = "perl02.cvt"; open(IFILE, "<$ifile"); # 入力ファイルのオープン open(OFILE, ">$ofile"); # 出力ファイルの作成 while (<IFILE>) { print "$_"; s/&/&/g; # &は&に置換 s/</</g; # <は<に置換 s/>/>/g; # >は>に置換 print OFILE "$_"; # 出力ファイルに出力 } # 入力データの終わり close(IFILE); # 入力ファイルのクローズ close(OFILE); # 出力ファイルのクローズ exit(0); $ifileに入力ファイル名を$ofileに出力ファイル名を書いてプログラムを保存してから実行します。 バッチファイルで起動する方が便利なのでバッチファイルの例を示します。 ドライブ名やディレクトリ名は環境によって変える必要があります。 cvt.bat C:\Perl4\jperl kigou.pl 簡単ですが、第2回はこれで終わります。 |