CGI-BBS > CGI > Perl > Perlについて文字列を一定文字数で改行したい。


カレッヂ
カレッヂ


質問者 まき  投稿日 7/22(月) 21:05:47
掲示板などで書き込まれたコメントを
強制的に一定文字数で(例えば5文字で)改行して表示したいのです。

例)$wordに「あいうえおかきくけこさしすせそ」があるとします。
これを、5文字毎に改行したいのです。

$word:「あいうえおかきくけこさしすせそ」
         ↓
$newword:「あいうえお<br>かきくけこ<br>さしすせそ<br>」


for($i=0; $i<length($word); $i+=10)
{
	$newword .= substr($word,$i,10);
	$newword .= "<br>";
}

こうすると、コメント文が全て全角だと大丈夫なのですが、
半角文字が入ってしまうと、うまく表示できません。

正規表現を使って作るのでしょうか??
解る方がおりましたらぜひ教えてください。
よろしくお願いいたします

プロバイダ参照:http://www.marimo.or.jp
サーバのOS:UNIXサーバ
パソコンのOS:Win95系
エディタ:K2エディター
FTPソフト:FFFTP
サーバ移転:していない
改造:(未選択)
CGI習熟度:(未選択)

回答者 moto  [削除]  投稿日 7/22(月) 22:55:44
文字コードがSHIFT-JISの場合であれば、以下のような感じで処理できます。

$n = 5;
$word =~ s/(.)/$1\0/g;
$word =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$1$2/g;
$word =~ s/((..){1,$n})/$1<br>/g;
$word =~ tr/\0//d;
回答者 みけ  [削除]  投稿日 7/23(火) 11:11:35
ちなみにEUCならこれでできます。

$n = 5;

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
$euc_num = "(?:$ascii|$twoBytes|$threeBytes){$n}";
	
$word =~ s/($euc_num)/$1<br>/g;

Perl5以上でないと動きませんが。

質問者 まき  [削除]  投稿日 7/23(火) 12:03:35
motoさん、みけさん
お返事ありがとうございました。
無事にプログラムは動作しました。
{}量指定子を使うんですね。
正規表現って難しいですね。

まだまだ勉強が必要です。
本当にありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技