|
1.複数行とはどういうことか?
前項で作った掲示板は複数行には対応していませんでした。
フォームから送信される改行コードはCRLF(\r\n),LF(\n),CR(\r)の三種類です。
ブラウザの種類によって異なる筈なので、ここではその三つ全てに対応しましょう。
HTMLでの改行は<BR>タグを使うので改行コードを<BR>に変換することで複数行に対応できます
2.改行コードの置換方法
以下のようにすることで置換えできます。
REPLACE(対象文字列,検索文字,置換文字)
\r\nを<br>に変換
REPLACE(対象文字列,"\r\n","<br>")
\rを<br>に変換
REPLACE(対象文字列,"\r","<br>")
\nを<br>
REPLACE(対象文字列,"\n","<br>") |
CRLFは\r\n
LFは\r
▼参考リンク
文字列を加工しよう
3.複数行対応掲示板を作る
-bbs4.bas-
#!/usr/bin/scriba
import cgi.bas
'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then
'変数commentに代入
comment=cgi::POSTParam("comment")
'改行を<br>に
comment=REPLACE(comment,"\r\n","<br>")
comment=REPLACE(comment,"\r","<br>")
comment=REPLACE(comment,"\n","<br>")
'書き込み
open "bbslog.txt" for append as 1
'ロック
LOCK #1,write
print #1,comment,"\n"
'ロック解除
LOCK #1,release
close 1
END IF
print "Content-Type: text/html; charset=euc-jp\n\n"
print """
<html><body>
<form action="bbs4.bas" method="POST">
<textarea name="comment" rows=4 cols=40></textarea><br>
<input type="submit" value="送信">
</form>
"""
'読み込み部分(ファイルが存在する場合)
IF FILEEXISTS("bbslog.txt") Then
open "bbslog.txt" for input as 1
'最後までループ
while NOT(EOF(1))
'comdataに代入
line input #1,comdata
'comdataが存在すれば表示
IF len(comdata)>0 Then print comdata,"<hr>"
wend
close 1
ELSE
print "ファイルがありません"
END IF
print "</html></body>" |
comment=cgi::POSTParam("comment")
comment=REPLACE(comment,"\r\n","<br>")
comment=REPLACE(comment,"\r","<br>")
comment=REPLACE(comment,"\n","<br>")
上記を追加し、bbs3.basからbbs4.basに変更した以外はbbs3.basとまったく同じプログラムです。
ためしに実行してみましょう

bbslog.txtに追記しましたので以前に書き込んだデータが残っていますが、気にしないで下さい。
(どうしても気になる場合はbbslog.txtを削除してください。新しいログが作られます)
一番下の「複数行改行テスト〜〜」が今回、書き込んだデータです。複数行改行できてますね。
今回、変更した部分は以下の部分を解説します。
comment=cgi::POSTParam("comment")入力されたデータをcommentに代入しました。
comment=REPLACE(comment,"\r\n","<br>")
comment=REPLACE(comment,"\r","<br>")
comment=REPLACE(comment,"\n","<br>")
この3つのREPLACE命令で改行コードを全て<br>タグに置換しています。これによってブラウザ上でちゃんと改行されるわけです。
置換しましたのでcgi::POSTParam("comment")ではなく print #1,comment,"\n" で変数commentを書き込んでいます。
表示部の変更ですがCGIのファイル名がbbs4.basですので<form>の送信先をbbs4.basに変更しています。
また、<input type="text">では複数行の書き込みが出来ないので、<textarea>を使って複数行に対応しています。
3.タグの入力について
HTMLタグの入力を禁止してみましょう。先ほどの掲示板に<font style="font-size:700pt">あああと書いてみてください。
巨大な文字が表示されました。これだけでも十分迷惑ですが、続いてタグの書かれていない普通のコメントを書きましょう。
まさに悲劇です。<font>タグを閉じてませんので、全てが巨大な文字となってしまいます。
解決策として < や > を見つけたら警告を出す方法と強制的に害のない < や >に換える方法の二つがあります。
ここでは害のない< や >を表示する方法を採用したいと思います
HTMLにはエスケープ文字というもののが用意されています。<をタグとして認識しないようにする為には > と書けばいいです。
< <と表示します
> >と表示します。
エスケープする為にはREPLACE命令を使用します。
4.<>をエスケープだ!
それでは早速、プログラムを見ていきましょう。
-bbs5.bas-
#!/usr/bin/scriba
import cgi.bas
'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then
'変数commentに代入
comment=cgi::POSTParam("comment")
'HTMLタグの置換
comment=REPLACE(comment,"<","<")
comment=REPLACE(comment,">",">")
'改行を<br>に
comment=REPLACE(comment,"\r\n","<br>")
comment=REPLACE(comment,"\r","<br>")
comment=REPLACE(comment,"\n","<br>")
'書き込み
open "bbslog.txt" for append as 1
'ロック
LOCK #1,write
print #1,comment,"\n"
'ロック解除
LOCK #1,release
close 1
END IF
print "Content-Type: text/html; charset=euc-jp\n\n"
print """
<html><body>
<form action="bbs5.bas" method="POST">
<textarea name="comment" rows=4 cols=40></textarea><br>
<input type="submit" value="送信">
</form>
"""
'読み込み部分(ファイルが存在する場合)
IF FILEEXISTS("bbslog.txt") Then
open "bbslog.txt" for input as 1
'最後までループ
while NOT(EOF(1))
'comdataに代入
line input #1,comdata
'comdataが存在すれば表示
IF len(comdata)>0 Then print comdata,"<hr>"
wend
close 1
ELSE
print "ファイルがありません"
END IF
print "</html></body>"
|
▼実行結果(サンプル)

comment=REPLACE(comment,"<","<")
comment=REPLACE(comment,">",">")
REPLACE()関数でHTMLタグの<を<に置換、エスケープしました。
同じように>は>に置換しています。こうすることによりタグとしてではなくそのまま表示させることが可能です。
他の変更点は<form>タグの送信先がbbs5.basになった点ぐらいでしょうか?
長いプログラムに見えますが、今までを少し改良しただけです。わざわざ打ち直す必要はありません。
コピー&貼り付け(ペースト)でプログラムを理解していただければ十分かと思います。 |
|
|
|