• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cgiで文章を32文字ごとに改行)

cgiで文章を32文字ごとに改行する方法

このQ&Aのポイント
  • cgi初心者の方が、入力画面で入力した文章を32文字ごとに改行し、URLが終わった後に改行する方法がわからないとのことです。現在のコードでは文字化けや改行の位置がうまくいかず、困っているようです。
  • 質問者はEUCでのコードを使用しており、現在のソースコードを添付している場合もあります。しかし、現在のコードでは半角文字が途中に入ると文字化けしてしまうなどの問題があります。
  • 質問者は文章の文字数を算出し、32文字で割った回数をループで回して改行を挿入する方法を試してみたがうまくいかなかったようです。改行の位置がうまく合わず、半角文字の扱いもうまくいっていないようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

 文字をあらわすコードは、長さが一律でないですから単純に数では切れません。文字と文字の境界を知らないとなりません。  また、URLを含むと言うことで、事前に他のキーワードに変換しておかなければなりません。具体的には 【引用】____________ここから $http_URL_regex = q{\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f} . q{][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.)} . q{*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\.} . q{[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f]} . q{[0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-} . q{Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f} . q{])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)} . q{*)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])} . q{*)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*} . q{)?};  さて,ここまで長々と書いてきましたが,正確に正規表現を書くことを あきらめて,もっと簡単でいいやという人のための http URL の正規表現が以下になります.   s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[Perlメモ( http://www.din.or.jp/~ohzaki/perl.htm#URI )]より  いったんこれでURLを見つけて、他のキーワードに変更しておきます。  そのうえで、 ⇒特定の長さで折り返す( http://www.din.or.jp/~ohzaki/perl.htm#JP_Fold )  を行いますが、先のキーワードの問題がありますから、キーワードの前後で改行を入れておいたほうが良いでしょう。  なお、フォームメールでしたら<textarea>をheardにしておいて、入力時に改行させて改行コードどもに受信するほうが楽かと思います。<TEXTAREA wrap="hard">

phpstudy
質問者

お礼

返事遅くなりました。 参考になります。 ありがとうございました。 確認画面の表示部分がcgiだったので対応できなかったので、質問させていただきました。 なんとか処理が完了したので載せて起きます。 改行ごとに配列につっこんで、一文字ずつ分解し、半角が続くようなら改行せず、それ以外は指定バイト数で改行。 $ascii = '[\x00-\x7F]'; #1バイト文字 $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; #2バイト文字 $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; #3バイト文字 $body_1 = &nl2br($FORM{'body'}); $m_moji = 30;#折り返しバイト #改行毎を配列に代入 foreach $line (split /<br>/g, $body_1){ $all_moji = 0; #1文字ずつに分解 @array = split m/($ascii|$twoBytes|$threeBytes)|.|\n/go, $line; foreach $moji (@array){ $mojisu = length $moji; $all_moji = $mojisu + $all_moji; $body .= $moji; if($mojisu > 1 && $all_moji > $m_moji){ $body .= '<br>'; $all_moji = 0; } } $body .= '<br>'; }

関連するQ&A