人に聞けない痔の悩み、これでスッキリ >>

フリーの改造OKなCGIを改造していますが、上手く行きません。

<textarea name=com cols="70" rows="10" wrap="OFF"></textarea>

上記のタグで入力したテキストの末尾に、自動で改行タグを付けて
$com に渡してデータ保存をしたいのですが、なかなか上手く行き
ません。どの様な記述をすればよいでしょうか?
ご指導宜しくお願い致します。

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

A 回答 (7件)

元の BreakPutter.cgi を少し見てみました。

その中に、次のコードがあります。

sub Change {
$result = $input{'document'};
$break = $input{'tag'};
if ($break eq 'br_head') {
$result =~ s/(\r\n|\r|\n)/$1<br>/g;
} elsif ($break eq 'br/_end') {
$result =~ s/(\r\n|\r|\n)/<br \/>$1/g;
} elsif ($break eq 'br/_head') {
$result =~ s/(\r\n|\r|\n)/$1<br \/>/g;
} else {
$result =~ s/(\r\n|\r|\n)/<br>$1/g;
}
}

少し問題はあると思いますが、それはともかくとして Change サブルーチンの最後の段階で
$result は、デコード済みで <br> タグ付きのデータになっています。Change の末尾に
$result をファイルに落とすコードを追加すれば、サーバーに保存することができます。
それとも、考えているのはクライアント側での保存ですか?
    • good
    • 0

> $com =~ s/(\x0d\x0a|\x0a|\x0d)/<br>/g; の記述を


> <textarea name=com cols="70" rows="10" wrap="HARD"></textarea> の下に
> 記述してみたのですが・・・

フォームの
<textarea name=com cols="70" rows="10" wrap="HARD"></textarea> の下に
$com =~ s/(\x0d\x0a|\x0a|\x0d)/<br>/g; を記述しても意味がありません。
受信したデータを処理するスクリプトに挿入してください。
それと、POSTメソッドの enctype属性値がapplication/x-www-form-urlencode(デフォルトモード)、または GETメソッドで送信されたデータの(デコード前の)改行コードは、%0D,%0A です。
ついでですが、enctype属性値multipart/form-data、text/plainで送信されたデータの改行コードは元々 \x0A,\x0Dです。
また、text/plainで送信されたデータはすべての各入力値の末尾に改行コードが付加されます。
なお、enctype属性値text/plainを使うと日本語文字をセットできないブラウザがありますから、text/plainで送信するのは避けるのがよさそうです。
    • good
    • 0

<textarea>の wrap属性値がご期待に合ってないと思いますよ。


何で、わざわざ「OFF」にしてあるのか知れませんが、
「OFF」・・・ 改行コードはすべて省いて送信する
「SOFT」・・・ 実際に改行されているところに改行コードを入れて送信する
「HARD」・・・ 実際に改行されているところと、画面上で折り返されているところに改行コードを入れて送信する
ということではなかったかな。
Webブラウザによって違いはあるようですが、たいていのデフォルト値は「SOFT」のようです。
ですから、
  <textarea name=com cols="70" rows="10" wrap="HARD">
としてやれば、うれしい結果が得られるんじゃないでしょうか。
ただし、アクセス元の機種OSの改行コードの違い(\x0D\x0A|\x0A|\x0D)を吸収する処理を忘れないでね!

この回答への補足

レスありがとうございました。
あまり時間が無かったのですが、OFFをHARDにするだけなら…
と思ってワクワクしながら試したのですが、上手く行きませんでした。
$com =~ s/(\x0d\x0a|\x0a|\x0d)/<br>/g; の記述を
<textarea name=com cols="70" rows="10" wrap="HARD"></textarea> の下に
記述してみたのですが・・・

今日・明日と用があるので、土日にもう一度試してみたいと思います。
また、報告させて頂きますので、解らない点が出来ましたら
宜しくご指導お願いします。

補足日時:2008/09/04 20:12
    • good
    • 0

>

http://htmldwarf.hanameiro.net/tools/BreakPutter …
> ↑のようなツールを配布されているので、応用できないかと試行錯誤
> しておりました。

これは単に改行を <br> に変換しているだけでは。

$com =~ s/(\x0d\x0a|\x0a|\x0d)/<br>/g;

> 時々文字化けして困っています。
> 何か良い方法を探してみます。

開業直前がシングルバイト文字かマルチバイト文字の一番最後に
マッチしなければその前で改行するようにすればいいんじゃない
でしょうか。

エンコードがSJISだとして以下のような感じで...。

my $str = ' ';
foreach(0x82a0 .. 0x82f1) {
my $buf = sprintf('%04x', $_);
$buf =~ s/([\da-f]{2})/pack('C', hex($1))/egi;
$str .= $buf;
}
$str =~ s/(?<=\G.{39})(.)/&func($1 . $2)/ge;
print $str;
exit;

sub func {
my $str = shift;
$str =~ s/([\x81-\xfc])?$/\n$1/i;
return $str;
}

もっと効率のいい方法があるかも知れませんが。
    • good
    • 0
この回答へのお礼

レスありがとうございました。
少し忙しくなったので、昨日はレスできませんでした。
今日・明日も用があるので、土日に試してみたいと思います。
また、報告させて頂きますので、解らない点が出来ましたら
宜しくご指導お願いします。

お礼日時:2008/09/04 20:12

<textarea> タグは、ほかのタグと違って改行を無視しません。

サーバーに送る際にも、
改行付きで送られるはずです。次の簡単な CGI を設置して実行してみてください。

area_test.cgi
#!/usr/bin/perl -wT
use strict;

my $com = '';
if ($ENV{QUERY_STRING}) {
($com) = $ENV{QUERY_STRING} =~ /=(.*)$/;
$com =~ s/%0D%0A|%0A|%0D/<br>/g;
$com =~ tr/+/ /;
}

print <<"HTML";
Content-type: text/html

<html><head><title>textarea test</title></head>
<body>
<form action="area_test.cgi" method="get">
<textarea name="com" cols="70" rows="10" wrap="off"></textarea>
<p><input type="submit" value="send"></p>
</form>
<p>value:<br>$com</p>
</body></html>
HTML

テキストエリアに次の3行を入力して、送ってみてください。

line 1
line 2
line 3

ブラウザの URL 欄の表示は、次のようになると思います。

http:// ~ /erea_test.cgi?com=line+1%0D%0Aline+2%0D%0Aline+3%0D%0A

文字コードによって、%0D%0A は %0A や %0D のことがありますが、改行コードが
送られていることを確かめることができます。あとは、この改行コードを置き換え
るだけです。
    • good
    • 0
この回答へのお礼

レスありがとうございました。
少し忙しくなったので、昨日はレスできませんでした。
今日・明日も用があるので、土日に試してみたいと思います。
また、報告させて頂きますので、解らない点が出来ましたら
宜しくご指導お願いします。

お礼日時:2008/09/04 20:11

末尾というのは文字列の末尾じゃなくてテキストエリアの各行に


改行を入れたいということなのでしょうか。
それだとPerl側からそれを取得することは不可能ですのでできないと
思います。

> $com =~ s/.{40}/$&<br>\n/g;

これだと、SJISやEUC-JPなどで日本語などの1byte文字以外の文字が
途中で分割されてしまい、化けたりする原因になると思いますが。

この回答への補足

>末尾というのは文字列の末尾じゃなくてテキストエリアの各行に
>改行を入れたいということなのでしょうか。

そうなんです。

>それだとPerl側からそれを取得することは不可能ですのでできないと
>思います。

http://htmldwarf.hanameiro.net/tools/BreakPutter …
↑のようなツールを配布されているので、応用できないかと試行錯誤しておりました。

>これだと、SJISやEUC-JPなどで日本語などの1byte文字以外の文字が
>途中で分割されてしまい、化けたりする原因になると思いますが。

はい^^;
時々文字化けして困っています。
何か良い方法を探してみます。

補足日時:2008/09/02 17:07
    • good
    • 0

どこまでできているんでしょうか。


単に文字列連結代入演算子は .= ですけど。

my $com = 'test';
$com .= "\n";
print $com;

この回答への補足

レスありがとうございます。

今は、htmlに書き出すとき
 $com =~ s/.{40}/$&<br>\n/g;
上の記述で全角20文字で改行させています。

データの保存時に同様にしても改行タグは保存してくれません。
また、出来る事なら全角20文字で改行するのでなくて
textareaに入力された行の右端に改行キーを付けたいです。

補足日時:2008/09/02 14:12
    • good
    • 0

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング