WEB相談室

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

タイトル:複数行のデータの末尾の改行削除

0:[投稿] 貴子 [2002/05/19 14:15 ][環境:MAC+NN UNIX系+Perl]

フォームから入力された複数行のデータの末尾に個数不明の改行があった場合、
それを取り除きたいのですがどうしたらいいでしょうか。
尚、途中(データの末尾以外)の改行は削除せず、上記の処理の前後で
データに下記の置換を行うことが前提です。

$_[0] =~ s/</&lt;/g;
$_[0] =~ s/>/&gt;/g;
$_[0] =~ s/\r\n/<br>/g;
$_[0] =~ s/\r/<br>/g;
$_[0] =~ s/\n/<br>/g;

$_[0] =~ s/<br>//g;
とすると、途中の必要な改行タグまで消えてしまいます(当然ですが)
良い方法がありましたらご教授願います。


1:[回答] やじうま1号 [2002/05/19 16:41 ]

gオプションをつけると、文字列全てが対象になります。

$_[0] =~ s/\r\n/<br>$/m;
$_[0] =~ s/\r/<br>$/m;
$_[0] =~ s/\n/<br>$/m;
とすると、一行ごとで、最後のm;をs;にするとその文字列の最後の改行を変換します。


2:[質問] 貴子 [2002/05/19 20:44 ]

回答ありがとうございます。
以下のように考えたのですが、うまくいきません。
多分どこか勘違いしていると思うので、ご指摘頂ければ幸いです。

#最後の改行を削除
$_[0] =~ s/\r\n//s;
$_[0] =~ s/\r//s;
$_[0] =~ s/\n//s;

#他の部分の改行を変換
$_[0] =~ s/\r\n/<br>/g;
$_[0] =~ s/\r/<br>/g;
$_[0] =~ s/\n/<br>/g;

この場合、複数行あるうちの1行目のみ改行が全部消えて、
本来消したいはずの最終行の改行が消えないんです…。
$data="あ\n\nい\n\nう\n\nえ\n\nお\n\n";
を変換すると
$data="あい<br><br>う<br><br>え<br><br>お<br><br>";
となってしまいます。
$data="あ<br><br>い<br><br>う<br><br>え<br><br>お";
となるようにしたいのですが…。


3:[回答] おーなーしぇふ [2002/05/19 23:25 ]

これでいけると思うのですが?

$_[0] =~ s/</&lt;/g;
$_[0] =~ s/>/&gt;/g;
$_[0] =~ s/\r\n/<br>/g;
$_[0] =~ s/\r/<br>/g;
$_[0] =~ s/\n/<br>/g;

$_[0] =~ s/(<br>)+$//;

ここでの「$」は「文字列の末尾」の意。従って「(<br>)+$」は、「文字列の末尾まで続く<br>の繰り返し」となります。


4:[回答] 通行人 [2002/05/20 05:11 ]

改行コードを統一してから置き換えする方が効率的かと・・・


5:[回答] jam [2002/05/20 09:16 ]

chompしてから置換するのじゃだめですか?


6:[回答] TOM neko [2002/05/20 13:08 ]

>>5
chompだと\r\nの改行は消せないのでは?


7:[回答] jam [2002/05/20 13:45 ]

改行コードを統一してからchompですね。
>フォームから入力された複数行のデータの末尾に個数不明の改行があった場合、
というか個数不明の改行ってなってましたね・・・
文章しっかり読め俺!!

ということで?
$_[0] =~ s/\x0D\x0A|\x0D|\x0A/\n/g;
$_[0] =~ s/\n*$//;
$_[0] =~ s/</&lt;/g;
$_[0] =~ s/>/&gt;/g;
$_[0] =~ s/\n/<br>/g;
とかでどうでしょう?


8:[回答] やじうま1号 [2002/05/20 14:09 ]

一番上のは遅いので展開すれば良いですけど。
これでテストするとちゃんとできるはずです(7)


9:[回答] おーなーしぇふ [2002/05/20 14:37 ]

>> 4
> 改行コードを統一してから置き換えする方が効率的かと・・・
たしかに(^^;)ご指摘ありがとうございます。

というわけで
>> 7
を参考にさせていただいて『展開すれば良いですけど』の部分をフォローしてこんな感じで。

$_[0] =~ s/\x0D\x0A/\n/g;
$_[0] =~ tr/\x0D\x0A/\n\n/;
$_[0] =~ s/\n*$//;

$_[0] =~ s/</&lt;/g;
$_[0] =~ s/>/&gt;/g;
$_[0] =~ s/\n/<br>/g;

なお、改行コードの統一については以下のページを参考のこと。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify



10:[完了] 貴子 [2002/05/20 20:17 ]

皆さん、ご丁寧にありがとうございました!
ようやく意図通りの置換が行えました。
詳細ページのご紹介もありがとうございます。改行コードについて
勘違いしていたことや知らなかったことなど、とても勉強になりました。
本当にありがとうございました。
また機会がありましたらよろしくお願い致します!


11:[完了] やじうま1号 [2002/05/21 16:23 ]

>>6
$/をundefして、\rを削除してからchompをかければ\nを<br>に変えるだけで済むかもしれません

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World