CGIのカスタマイズに関する質問です。
ソードワールドRPGキャラクターシート管理CGIを使用しています。
初期の設定で<input type>と<textarea>の改行をする際は<br>を使うと言う形になっています。
その中で<textarea>の改行をエンターキーでしたいと思い、
sub htmlunquote{
my $text = shift;
$$text =~ s/&lt;/</g;$$text =~ s/&gt;/>/g;
の部分を
sub htmlunquote{
    my $text = shift;
$$text1 =~ s/\r\n/<br>/g;
$$text1 =~ s/\r/<br>/g;
$$text1 =~ s/\n/<br>/g;
と変換してみました。
すると、エンターキーで改行できるようになったのですが、修正や追記しようとすると、何故か前に書き込んだ文章が消えてしまっています。

なぜ、文章が消えてしまうのか、全く検討がつきません。FFFTPから、データを覗くと、書き込まれたデータはあるのですが……。
それとも改行をさせる方法が根本的に間違っているのでしょうか。
ご教授お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ソースを見てみました。


キャラクタ更新フォームのデータを読むところで、
$_ =~ s/<(.*?)>([^<]+)<\/.*?>/$pc{"$1"} = $2;/egi while <IN>;
と、しているためデータ内に<br>が入っているとその項目が読み込み出来ません


下記の様に変更してみてください

sub htmlunquote{
my $text = shift;
$$text =~ s/&lt;/</g;$$text =~ s/&gt;/>/g;
$$text =~ s/\n/<br>/g;
}
sub htmlquote{
my $text = shift;
$$text =~ s/&/&amp;/g;$$text =~ s/"/&quot;'/g;
$$text =~ s/</&lt;/g;$$text =~ s/>/&gt;/g;
}
表示時は<br>に変換、記録時は改行をそのまま残します。

キャラクタ更新フォームのデータを読む箇所は
改行が入っているとwhile <IN>が分割されてしまうため下記のように変更
open(IN, "$chardatadir${file}.cgi") or error('システムエラー',"キャラクターファイル($file)が開けません。");
$_=join("",<IN>);
$_ =~ s/<(.*?)>([^<]+)<\/.*?>/$pc{"$1"} = $2;/egi;
close(IN);

これでOKになるはず
    • good
    • 0
この回答へのお礼

ありがとうございます!
教えて頂いたように修正しましたら、希望していた通りになりました。
丁寧に教えてくださって、感謝しております。
本当にありがとうございました。

お礼日時:2007/05/10 03:40

ソードワールドRPGキャラクターシート管理CGI


とは、
http://www.vector.co.jp/soft/unix/game/se149734. …
これでしょうか?
sub htmlunquoteと言う部分が見あたりませんが・・・

ひょっとすると、
<textarea>の初期値の設定方法が間違っているということはありませんか?
<textarea>初期値</textarea>です

この回答への補足

言葉足らずで申し訳ありません。
そのCGIのVer.2.00が、CGI作成者さまのサイト http://www.new-f.com/
でDLできまして、そちらを使っております。

<textarea>初期値に関しては、DLした状態から変更していないので、恐らく、間違ってはいないと思います。

補足日時:2007/05/09 21:34
    • good
    • 0

うーん。

改行は変換しない方が良いんじゃない?
で <span style="white-space:pre"></span> (かpreタグ)で表示しちゃう。  とか。
    • good
    • 0
この回答へのお礼

素早いお答えありがとうございます。
改行部分は変更しない方が良いようなのですね。
教えて頂いた方法でチャレンジしようと思います。

お礼日時:2007/05/09 21:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q[返信]

夜分にすみません。
[~]の鍵括弧はどういう言語なのでしょうか?
htmlの辞書に載っていませんでした・・。

Aベストアンサー

ブラウザで見ると
[返信]
って感じになり「返信」のトコだけ下線付きのリンクになります。
「[」と「]」は単なる文字ですよ(笑)

Q
の場所は?

CGIでデータを受け渡しするアンケートを作っています。html中に書く<form method=post action="***.cgi">~</form>“~”の場所についてですが質問項目を全て挟まなくてはいけませんか?実は、チェックボックスの「最大2つまで回答可」という部分をJavascriptでチェック個数を超えてチェックした時点でアラートが出るようにしてます。その記述中にすでに<form>~</form>タグを制限をかけたい質問に置いているので、質問全体を<form method=post action="***.cgi">~</form>でくくると入れ子になってしまいます。大丈夫ですか?

Aベストアンサー

<form method=post action="***.cgi" name="form1">~</form>
にする。つまり「最大2つまで回答可」という部分だけをonclickでJavascriptを呼び出したらいいと思います。

Aベストアンサー

>画像ヘッダとはどういうものでしょうか?

Content-type: image/gif
Content-type: image/png
Content-type: image/jpeg

など、画像タイプごとに決まっています。
<img>タグに普通の画像ファイルが指定されている場合は
Webサーバが画像ファイルの拡張子から判断して返してくれ
ますが、CGIから返されるデータの種類は拡張子からは判断
できないのでCGI内部からヘッダを返す必要があります。


●CGIがPerlの場合で、GIF画像をCGIから返す例
#!/path/to/perl
print "Content-type: image/gif\n\n";
open(GIF, "file.gif");
binmode(GIF); binmode(STDOUT);
print <GIF>; close(GIF);

もちろん、CGIからは画像フォーマットを返せばいいので、
ファイルから読まずにあらかじめCGIソース内に画像データ
を持っておいて出力する方法も可能です。


ちなみに、多くのCGIではHTMLコンテンツを返す場合が多い
ので、ヘッダは以下のようになります。

print "Content-type: text/html\n\n";

>画像ヘッダとはどういうものでしょうか?

Content-type: image/gif
Content-type: image/png
Content-type: image/jpeg

など、画像タイプごとに決まっています。
<img>タグに普通の画像ファイルが指定されている場合は
Webサーバが画像ファイルの拡張子から判断して返してくれ
ますが、CGIから返されるデータの種類は拡張子からは判断
できないのでCGI内部からヘッダを返す必要があります。


●CGIがPerlの場合で、GIF画像をCGIから返す例
#!/path/to/perl
print "Content-type: image/gif\n\n...
続きを読む

Qテキストエリア内でタグ
を使わずにenterキーで改行したい

myshop.cgiという、フリーのcgiを使いたくて、超初心者なりに色々
調べながらもなんとか思い通りに出来てきたんですが、一つだけ
どうしても自分では解決できなくて、困ってます。
enterキーでは改行できず、<BR>でしか改行できないテキストエリア内に、
ある文章をコピペしたいんですが、コピペした後に、いちいち<BR>を
入れるのが面倒なんで、enterキーで改行できるようにしたいんです。
しかし、どこをどういじればいいのかさっぱりわからなくて・・・。
とりあえず悩んでる付近のコードを載せておきます。
超初心者です!よろしくお願いします!
解決したいテキストエリアは、「サイトの紹介文」を入力するとこです。
-------------------------------------------------------------
print <<"EOF";
</select>$nini</td>
</tr>
<tr>
<td>カテゴリ3 <select name="ct3">
<option value="">選択しない</optin>
EOF

if ($use_sub) {
foreach (0 .. $#cates) {

@SUB = split(/\s+/, $subct[$_]);
$i=0;
foreach $j (@SUB) {
print qq( <option value="$_\,$i">$cates[$_] &raquo; $j</option>\n);
$i++;
}
}
}

if (!$print_url) { $nourl = qq(<span style="color:red;">現在非表\示に設定されています。</span> ); }

print <<'EOF';
</select>$nini</td>
</tr>
<tr>
<td>サイトタイトル <small>(タグ利用可\能\ / 同じECサイトのテキスト広告が効果的)</small><br>
<input type="text" name="tl" size="68"></td>
<tr>
<tr>
<td>バナーのHTMLコード <small>(アフィリエイト仲介サイトからコピー&amp;ペーストして下さい。)</small><br>
<textarea name="code" cols="54" rows="8"></textarea></td>
</tr>
<tr>
<td>サイトの紹介文 <small>(タグ利用可\能\ / 但し改行は反映されないので<span style="font-weight:bold;">&lt;br&gt;を使用</span>して下さい。)</small><br>
<textarea name="msg" cols="54" rows="20"><BR><BR><BR><BR></textarea></td>
</tr>
<tr>
<td>価格 <small>(タグも利用可\能\)</small><br>
<input type="text" name="url" size="68"></td>
<tr>
<tr>
<td>サイトに関係の深いキーワード <small>(任意。検索で使用、5個までで最大文字数は20文字。)<br>
<input size="14" type="text" name="key1" maxlength="20">
<input size="14" type="text" name="key2" maxlength="20">
<input size="14" type="text" name="key3" maxlength="20">
<input size="14" type="text" name="key4" maxlength="20">
<input size="14" type="text" name="key5" maxlength="20"></td>
</tr>
<tr>
<td>サイト紹介文の位置<br>
<input type="radio" name="line" value="0" id="bot" checked><label for="bot">バナーの下</label>
<input type="radio" name="line" value="1" id="sid"><label for="sid">バナーの横</label></td>
</tr>
<tr>
<td>オススメマーク<br>
<input type="radio" name="rec" value="0" id="ron" checked><label for="ron">付けない</label>
<input type="radio" name="rec" value="1" id="rof"><label for="rof">付ける</label></td>
</tr>
<tr>
<td>表\示状態 (非アクティブにチェックを入れると一覧には表\示されません。)<br>
<input type="checkbox" name="no_act" value="1" id="nact"><label for="nact">非アクティブにする</label></td>
</tr>
<tr>
<td align="center"><br>
<input type="submit" value=" 登録する "><input type="reset" value="リセット">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
EOF
exit;

myshop.cgiという、フリーのcgiを使いたくて、超初心者なりに色々
調べながらもなんとか思い通りに出来てきたんですが、一つだけ
どうしても自分では解決できなくて、困ってます。
enterキーでは改行できず、<BR>でしか改行できないテキストエリア内に、
ある文章をコピペしたいんですが、コピペした後に、いちいち<BR>を
入れるのが面倒なんで、enterキーで改行できるようにしたいんです。
しかし、どこをどういじればいいのかさっぱりわからなくて・・・。
とりあえず悩んでる付近のコードを載せておきま...続きを読む

Aベストアンサー

サブルーチン decode の
 $in{'code'} =~ s/\r\n//g;
 $in{'code'} =~ s/\r//g;
 $in{'code'} =~ s/\n//g;
 $in{'msg'} =~ s/\r\n//g;
 $in{'msg'} =~ s/\r//g;
 $in{'msg'} =~ s/\n//g;
ですべての改行文字を削除していますから、ここを
 $in{'code'} =~ s/\r\n/<br>/g;
 $in{'code'} =~ s/\r/<br>/g;
 $in{'code'} =~ s/\n/<br>/g;
 $in{'msg'} =~ s/\r\n/<br>/g;
 $in{'msg'} =~ s/\r/<br>/g;
 $in{'msg'} =~ s/\n/<br>/g;
にすれば、とりあえずご希望は叶うでしょう。

Qテキストエリアの
を非表示にするには

掲示板のようなCGIを利用し、入力フォームから送信された情報が保存されるプログラムを利用しています。
そのcgiファイルに記述されたコードに以下の記述があります。

sub decode {
&ReadParse;
while (($key,$val) = each %in) {
if ($key !~ /upfile/ ) {
&Jcode'convert(*val, "utf8", "", "z");
if ( $key !~ /label_name/ ) {
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
}
$val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g;
}
$in{"$key"} = "$val";
}
$_v = $in{"_v"}; $del_img = $in{"del_img"};
}

この記述によりテキストエリアで改行された際に「<br>」に変換されると思うのですが、これを<br>から<br />に変えるため、
$val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g;を
$val =~ s/\r\n/<br \/>/g; $val =~ s/\r|\n/<br \/>/g;と変えました。
これにより、保存される改行コードが<br>から<br />に変わったのですが、その情報を編集するため再度保存された情報の入力フォームを呼び出すと、
テキストエリアでは改行されず、改行場所に<br />と入力されてしまいます。
もとのコードではテキストエリア内の改行は<br>が表示されず、ちゃんと改行されていました。

そこで以下のように書き直してみたのですが、やはり状況は変わりません。
sub decode {
&ReadParse;
while (($key,$val) = each %in) {
if ($key !~ /upfile/ ) {
&Jcode'convert(*val, "utf8", "", "z");
if ( $key !~ /label_name/ ) {
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
$val =~ s/ / /g;
}
$val =~ s/\r\n/<br \/>/g; $val =~ s/\r|\n/<br \/>/g;
}
$in{"$key"} = "$val";
}
$_v = $in{"_v"}; $del_img = $in{"del_img"};
}

改行コード<br>を<br />に変更し、保存された情報を呼び出してもテキストエリアで改行コード<br />は表示されることなく改行される記述方法を教えてください。

分かりにくい文章で申し訳ありませんがよろしくお願いします。

掲示板のようなCGIを利用し、入力フォームから送信された情報が保存されるプログラムを利用しています。
そのcgiファイルに記述されたコードに以下の記述があります。

sub decode {
&ReadParse;
while (($key,$val) = each %in) {
if ($key !~ /upfile/ ) {
&Jcode'convert(*val, "utf8", "", "z");
if ( $key !~ /label_name/ ) {
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
}
$val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g;
}
$in{"$key"} = "$val";
}
$_v = $in{"_v"}; $del_img = $in{"del_img"};
}

この記...続きを読む

Aベストアンサー

もともと、 <br>→改行 は動作していたのでしょうか?
提示された中に、上記変換している部分が無いようですが


人気Q&Aランキング

おすすめ情報