WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:改行について。

0:[投稿] おさむ [MAIL] [URL] [2005/05/05 15:12 ][環境:WIN XP UNIX]

 CGI初心者です。最近なんらかの日記風なデータベースを作ろうと思って、簡単なスクリプトを作りました。
 掲示板風みたいに単純にフォームから入力し、保存して呼び出すという簡単なものですが、<textarea></textarea>から入力した文章が全く改行されないのです。
 フォームで入力した改行と同じように保存したいのですが、どんな風にやったらよいのでしょうか?文章の改行で\nを打ち込んでゆくというのは、ちょっと格好悪いかな…という感じです(汗)。
 あるいは、フォームのテキストエリア内で改行した場合に、転送される文字列には、どういった改行コード(のようなもの)が含まれているんでしょうか?それを拾って<br>とかに置換すれば、何とかなると思っているのです。

 知っている方がいましたら、よろしくお願いします。
 現在スクリプトをいじっている途中で半端なのですが、これです。
http://tangsten.oops.jp/cgi/textup_ver01/text_view.cgi
http://tangsten.oops.jp/cgi/textup_ver01/form.html

 


1:[関連] おさむ [MAIL] [URL] [2005/05/05 15:16 ]

 訂正

 もちろん、改行で保存する必要はないので、呼び出してHTMLなどで出力する際にどのような加工を施すと、送信した文章と同じ改行の形がとれるだろうか?ということです。
 現在はデータを全て<>で区切って、一行にして保存しています。上記のスクリプトは、そのままの状態で表示してあります。


2:[回答] 通りがかり。 [2005/05/05 16:52 ]

>それを拾って<br>とかに置換すれば、何とかなると思っているのです。

そのとおりですが、何か都合が悪いことでもあったのでしょうか?


3:[質問] おさむ [MAIL] [URL] [2005/05/06 00:35 ]

 不都合というか、いろいろ調べてもわからなかったんです。

 フォームでもって名前($name)とかメール($mail)とか変数に入れますよね?それで比較的長い文章を例えば$textに入れたりした場合に、改行されずに全部一列で保存されてしまうんです。
(このテキストもフォームのテキストエリア内で改行してますでしょ? ↓で次の行に行きます。)
 この改行の形のままHTML出力したいのですが、僕の知識だと、

いろいろ調べてもわからなかったんです。\n
…みたいに何かしらの記号を入れておかないと、加工できないんですが、テキストエリアに\nっていう記号を入れて投稿する人ってやっぱりいませんよね?そういう意味で、長い文章などの改行というものは保存(書き込み)する際に、あるいは読み込みしてHTML出力する際には、みなさんは具体的にどんな風にスクリプトを作っているのか伺いたいのです。

 質問のところで記載していあるURLでは、一行中の最後の長い文章のことです。


4:[回答] 通りがかり。 [2005/05/06 00:56 ]

いや…
長い文章が1列で保存されると、何が悪いのでしょうか?
HTMLの例えばTABLEタグの中にその文章を入れれば、その指定した幅で折り
返すはずですが、一行を長くすることによって、何か不都合があるのでしょ
うか?
もし、改行が入らないことで、レイアウトが無茶苦茶になるというのなら、
実際におさむさんが作られているCGIを、見せてもらえれば、何かしらのア
ドバイスができるのではないかと思いますが。


それとも、80文字なら80文字ごとに改行を入れたい…
そんな単純なことなんでしょうか?
それなら、
http://www.din.or.jp/~ohzaki/perl.htm#JP_Fold
が参考になるのではないでしょうか。

で、結局最終的には、自分が納得した場所(改行場所)に<br>を入れて
しまえば良いのではないかと思うのですが、違うのでしょうか?


5:[回答] バギンズ [2005/05/06 01:13 ]

一旦、改行は全て\r(CR=0x0d)に変換しておいてから保存し、

$text =~ s/\r\n/\r/g;  # CR/LFをCRに変換
$text =~ s/\n/\r/g;    # LFをCRに変換

表示する時に\rを<br>\nに変換してあげる

$text =~ s/\r/<br>\n/g ;  # CRを<br>+LFに変換

という方法を使ったりします。

<br>の後に\nを入れるのは、1行が長すぎると誤解釈を起こしてしまうブラウザがいたためです。(今時無いかな?)


6:[回答] バギンズ [2005/05/06 01:18 ]

あ、勘違いしてました。

通りがかり。さんの方法以外では、
textareaにwrap属性を指定する方法とかもありますけど...


7:[回答] B-Cus [2005/05/06 04:20 ]

> 1行が長すぎると誤解釈を起こしてしまうブラウザがいたためです

初めて聞きましたが、いつごろのブラウザでしょうか。NN2 とか?


8:[回答] おさむ [MAIL] [URL] [2005/05/06 20:56 ]

 なんだかすごくまどろっこしい説明をしてしまってますね。。

こんなことを言いたかったのです!!例えば、

 わたしは、
おさむという
名前です。

と、いう文章を誰かが送信したとすると、

 わたしは、おさむという名前です。

という風にしか(僕の場合だけですが(汗))保存できないのです。(ただの初心者です。。)この改行なしの一行のテキストを出力する際になんらかの加工を加えて、元々の形の

 わたしは
おさむという
名前です。

と、いう形にしたい!ということだったんです。
 たぶんいろんな方法があるのだと思いますが、具体的に皆様はどんな方法で文章の改行を加工しているのだろう?と思ったわけです。
 通りがかりさんの言うように、確かに幅を決めれば自動的に改行されるので全然心配ないです!いえ、今、読み直してみたら、説明の仕方が全然なってないです。はい。

>バギンズさん。
 textareaのWRAP属性は、やはりwrap="hard"とかいうものですよね。それで、

 わたしは\rおさむという\r名前です。\r

とか

 わたしは\nおさむという\n名前です。\n

というふうになっていれば、splitとかで加工が可能ですよね。

http://tangsten.oops.jp/cgi/textup_ver01/text_view.cgi
↑なのですが、この行ごとにある最後の長ったらしい文章は、読みづらいので、適当なところで改行したり、文頭の一文字をインデントしているのすが、それが出力の際に反映されないんです。

 方法論として、
1..txtなんかに直接文章の形を保存しておく(改行の形式を含めて)か、
2.ブラウザーに出力する際になんかの加工を施して、元々の文書の形を出力するか?
ってことになりますよね。
 たぶん、これ超初心者級の質問なんです。超初心者にものを教えるのはつらいかと思いますが…、よろしくお願いします。



9:[質問] おさむ [MAIL] [URL] [2005/05/06 21:18 ]

 そうなんです。もの凄く単純な質問なのですが、たぶん、プログラムに詳しい方々にはあまりにも単純な質問なので、「なんでそんなことがわからないの?」っていうレベルです。ある長い文章があって、

<1>
 テキストの処理をする際に送信
した文章が一行になってしまいま
す。
 適当に改行する方法を捜してい
るのですが、なかなか難儀です。

<2>
 テキストの処理をする際に送信した文章が一行になってしまいま
す。
 適当に改行する方法を捜しているのですが、なかなか難儀です。

<3>
 テキストの処理
をする際に送信し
た文章が一行にな
ってしまいます。
 適当に改行する
方法を捜している
のですが、なかな
か難儀です。

 という風にいかなる幅の場合でも改行箇所を固定したいんです。しかし、僕がやると、こんな風に一行になってしまうのです。
<4>
 テキストの処理をする際に送信した文章が一行になってしまいます。 適当に改行する方法を捜しているのですが、なかなか難儀です。


 
 


10:[回答] 薫 [2005/05/06 23:29 ]

>たぶんいろんな方法があるのだと思いますが、具体的に皆様はどんな方法で文章の改行を加工しているのだろう?と思ったわけです。
貴方はどんな方法で保存し、出力しているか把握できていますか?
色々考えすぎているのだと思いますので、初心に帰って

>あるいは、フォームのテキストエリア内で改行した場合に、転送される文字列には、どういった改行コード(のようなもの)が含まれているんでしょうか?それを拾って<br>とかに置換すれば、何とかなると思っているのです。
ここを重点に調べて見ましょう。


11:[回答] 通りがかり。 [2005/05/07 00:02 ]

textarea内で改行しているのに、改行コードが入ってない?
スクリプト中で、密かに\nなどを削除しているなんてことは無いですか?

あと、ブラウザーは何をお使いで?

っていうか、この掲示板では問題無く改行してますね。
ということは、ブラウザーのせいじゃないと...

やっぱスクリプト見ないとわからないや…


12:[回答] わんだ [2005/05/09 14:55 ]

結局ひとことで言えば、brをbrと認識出来ていないということのように思うのですが、そんな単純なことじゃない?
そんな単純なことだったとすると、
wrap属性は絶対必要だし、それとともに、5にバギンズさんが書いてるような本文の改行処理 たとえば

$in{'comment'} =~ s/\r\n/<br>/g;
$in{'comment'} =~ s/\r/<br>/g;
$in{'comment'} =~ s/\n/<br>/g;

も挿入しないと、うまく改行されないと思いますが、この処理はしてあるのにダメということですか?
その場合はわかりません。すみません。


13:[回答] AC1号 [2005/05/09 23:43 ]

掲示板の処理は、どんな掲示板でも投稿・表示の2つの作業を行っているはずです。

「投稿」ではPOSTされたデータを内部データ形式に変換してファイルに保存します。
「表示」では、内部データ形式で保存されたファイルを読み出して、HTMLに変換して出力します。
という作業を行っています。

で、「内部データ形式」は投稿・表示が簡単にできるようにスクリプト作成者が決めるものですが、これを元質問者が説明できていない(理解していない)ため、回答者側もどう答えたら良いのか分からないのでしょう。

内部データ形式は
a.複数の投稿をどのように分割するか
b.1つの投稿の各属性をどのように分割するか
c.各属性の値でa.,b.で使われている区切り子が来た時、どうするか
のポリシーが決まらないと読み書きできませんが、
http://tangsten.oops.jp/cgi/textup_ver01/text_view.cgi
からはどういうポリシーでファイル保存しているのか伝わってきません。
a.,b.については>>1で
>現在はデータを全て<>で区切って、一行にして保存しています。
と書かれているのですが、現在では崩れてしまっています。

以下、一部の回答者への突っ込み。
・wrap属性について
wrap属性はNN4以下やIE5以上の独自拡張です。これまでの投稿を見る限り、不特定多数の人が使うもののようですから、独自拡張は使うべきではないでしょう。

・&#165;r(論理的復帰文字≠CR)について
よく勘違いしている人がいるのですが、&#165;rはCRではありません。
perldoc perlopに書いてあります。
また、このスレッドで出てきたPerlメモにもあります。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_2BR


14:[回答] AC1号 [2005/05/09 23:47 ]

>>13
&#165;r は \r と読み替えて下さい。
#tildeとyen signが同時投稿できない…


15:[質問] おさむ [MAIL] [URL] [2005/05/10 00:28 ]

ライブラリーを幾つか使っていますが、主なスクリプトはこんな感じなんです。

$update = $in{"update"};
jcode::convert(\$in{"update"},"euc","","z");
$in{"update"} = ~s/\n/<br>/g;
$datafile = "./data/update.txt";
$tempfile = "./data/temp";
umask 0;
open(TMP, "> $tempfile");
print TMP "$year.$month.$mday(@weekly[$wday])","  ","$update<br>\n";


open(DATA,"< $datafile");
while (<DATA>) {
print TMP $_;
}
close (DATA);
close (TMP);
rename ($tempfile, $datafile);

 現在いろいろと勉強している最中で、自分の知っている最も基本的な機能ばかり使って作っています。3行目で、わんださんの言うところは入っているし、一応wrap="soft"にしています。保存は.txtでテキストファイルとして保存しているんです。

 たぶん、もの凄く簡単なことで直るような気がするんですが、簡単なことだけに初心者には難しいというところなんだと思っているんです。(本はあるのだけど、こんな問題にに直面する人っているのかしら?っていうぐらい単純なことなんだと思います。)


16:[回答] バギンズ [2005/05/10 01:29 ]

>print TMP "$year.$month.$mday(@weekly[$wday])","  ","$update<br>\n";
何も加工していない$updateの方を書いちゃってますね。

$update = $in{"update"};
の行を
$in{"update"} = ~s/\n/<br>/g;
の後に移動すればいいかな。

あと、↓この行ですが、
>$in{"update"} = ~s/\n/<br>/g;

= と ~ の間にスペースを入れるんじゃなくて、
=~ と s/\n/<br>/g;の間にスペースを入れてください。

それと、わんださんが書いているようにちゃんと3パターン変換しましょう。
$in{"update"} =~ s/\r\n/<br>/g;
$in{"update"} =~ s/\r/<br>/g;
$in{"update"} =~ s/\n/<br>/g;


17:[回答] AC1号 [2005/05/10 22:31 ]

>>15,16
基本的に入力したデータ自体を改変するのはスクリプトを分かりにくくします。
$in{"update"}は改変しないというポリシーにして、$updateのほうを変換する方がよいかと思います。
つまり、 $update = $in{"update"}; 以降の行に出てくる $in{"update"} を $update に変更して下さい。

それと >>13 で指摘した通り、 \r を使うのは誤りです。
$update =〜 s/\x0D\x0A/<br>/g;
$update =〜 s/\x0D/<br>/g;
$update =〜 s/\x0A/<br>/g;


18:[完了] おさむ [MAIL] [URL] [2005/05/14 22:49 ]

 できました!!
 初心者ではありますが、

『>print TMP "$year.$month.$mday(@weekly[$wday])","  ","$update<br>\n";
何も加工していない$updateの方を書いちゃってますね。

$update = $in{"update"};
の行を
$in{"update"} = ~s/\n/<br>/g;
の後に移動すればいいかな。

あと、↓この行ですが、
>$in{"update"} = ~s/\n/<br>/g;

= と ~ の間にスペースを入れるんじゃなくて、
=~ と s/\n/<br>/g;の間にスペースを入れてください。』

 ここに自分で気が付かなかったのが、原因です。バギンズさんありがとうございます。その他の方々もそれに付随するいろいろなアイディアをどうもありがとうございます!


19:[完了] おさむ [MAIL] [URL] [2005/05/20 22:42 ]

http://tangsten.oops.jp/techno_huu/index.html

かなり苦しみましたが、単純に考えて最初からやったら、できました!皆様ありがとうございます!

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World