- ベストアンサー
自動改行タグの挿入
フリーの改造OKなCGIを改造していますが、上手く行きません。 <textarea name=com cols="70" rows="10" wrap="OFF"></textarea> 上記のタグで入力したテキストの末尾に、自動で改行タグを付けて $com に渡してデータ保存をしたいのですが、なかなか上手く行き ません。どの様な記述をすればよいでしょうか? ご指導宜しくお願い致します。
- みんなの回答 (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 をファイルに落とすコードを追加すれば、サーバーに保存することができます。 それとも、考えているのはクライアント側での保存ですか?
その他の回答 (6)
- okmotokun
- ベストアンサー率59% (92/155)
> $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で送信するのは避けるのがよさそうです。
- okmotokun
- ベストアンサー率59% (92/155)
<textarea>の wrap属性値がご期待に合ってないと思いますよ。 何で、わざわざ「OFF」にしてあるのか知れませんが、 「OFF」・・・ 改行コードはすべて省いて送信する 「SOFT」・・・ 実際に改行されているところに改行コードを入れて送信する 「HARD」・・・ 実際に改行されているところと、画面上で折り返されているところに改行コードを入れて送信する ということではなかったかな。 Webブラウザによって違いはあるようですが、たいていのデフォルト値は「SOFT」のようです。 ですから、 <textarea name=com cols="70" rows="10" wrap="HARD"> としてやれば、うれしい結果が得られるんじゃないでしょうか。 ただし、アクセス元の機種OSの改行コードの違い(\x0D\x0A|\x0A|\x0D)を吸収する処理を忘れないでね!
- pick52
- ベストアンサー率35% (166/466)
> http://htmldwarf.hanameiro.net/tools/BreakPutter.cgi > ↑のようなツールを配布されているので、応用できないかと試行錯誤 > しておりました。 これは単に改行を <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; } もっと効率のいい方法があるかも知れませんが。
お礼
レスありがとうございました。 少し忙しくなったので、昨日はレスできませんでした。 今日・明日も用があるので、土日に試してみたいと思います。 また、報告させて頂きますので、解らない点が出来ましたら 宜しくご指導お願いします。
- kumoz
- ベストアンサー率64% (120/185)
<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 のことがありますが、改行コードが 送られていることを確かめることができます。あとは、この改行コードを置き換え るだけです。
お礼
レスありがとうございました。 少し忙しくなったので、昨日はレスできませんでした。 今日・明日も用があるので、土日に試してみたいと思います。 また、報告させて頂きますので、解らない点が出来ましたら 宜しくご指導お願いします。
- pick52
- ベストアンサー率35% (166/466)
末尾というのは文字列の末尾じゃなくてテキストエリアの各行に 改行を入れたいということなのでしょうか。 それだとPerl側からそれを取得することは不可能ですのでできないと 思います。 > $com =~ s/.{40}/$&<br>\n/g; これだと、SJISやEUC-JPなどで日本語などの1byte文字以外の文字が 途中で分割されてしまい、化けたりする原因になると思いますが。
補足
>末尾というのは文字列の末尾じゃなくてテキストエリアの各行に >改行を入れたいということなのでしょうか。 そうなんです。 >それだとPerl側からそれを取得することは不可能ですのでできないと >思います。 http://htmldwarf.hanameiro.net/tools/BreakPutter.cgi ↑のようなツールを配布されているので、応用できないかと試行錯誤しておりました。 >これだと、SJISやEUC-JPなどで日本語などの1byte文字以外の文字が >途中で分割されてしまい、化けたりする原因になると思いますが。 はい^^; 時々文字化けして困っています。 何か良い方法を探してみます。
- pick52
- ベストアンサー率35% (166/466)
どこまでできているんでしょうか。 単に文字列連結代入演算子は .= ですけど。 my $com = 'test'; $com .= "\n"; print $com;
補足
レスありがとうございます。 今は、htmlに書き出すとき $com =~ s/.{40}/$&<br>\n/g; 上の記述で全角20文字で改行させています。 データの保存時に同様にしても改行タグは保存してくれません。 また、出来る事なら全角20文字で改行するのでなくて textareaに入力された行の右端に改行キーを付けたいです。
補足
レスありがとうございました。 あまり時間が無かったのですが、OFFをHARDにするだけなら… と思ってワクワクしながら試したのですが、上手く行きませんでした。 $com =~ s/(\x0d\x0a|\x0a|\x0d)/<br>/g; の記述を <textarea name=com cols="70" rows="10" wrap="HARD"></textarea> の下に 記述してみたのですが・・・ 今日・明日と用があるので、土日にもう一度試してみたいと思います。 また、報告させて頂きますので、解らない点が出来ましたら 宜しくご指導お願いします。