アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になってます。
少し前に質問を投稿したはずなんですが検索しても出ないし
メールも届かないしで・・・もう一度投稿させて頂きます。

只今Perlでフォームから投稿された文字が縦書きに表示される様に作ってるのですが…行き詰まってしまいました。
自分で出来たのは
$message =~ s/(<[^>]+>)|(\&\w+;)|([-.!~*'()\w;\/?:\@=+\$,%#\[\]\^`"{|}]{1})/($3 eq '')?(($2 eq '')?$1:"<BR>$2"):"$3<BR>"/eg;
こんなショボーイ記述になってしまいまして・・・・
これでは半角英数字だけしか縦書きにならないし、おまけにどこまでも一列に縦書きにされて次の行へ行かず、長ーくなってしまいます。
どうににか15文字目で</TD><TD>タグを入れて次の行へ移れる様にしようと他の縦書きCGIの中身を拝見したりと研究してみたのですが
さっぱりわからず・・・どうか助けていただけないでしょうか。
宜しくお願い致します。

A 回答 (4件)

こんにちは。



正規表現やマッチング演算子は苦手でよく分からないのですが、SVAHAさんのソースは入力されたメッセージに記号エスケープなどの処理をして一文字ずつ<br>で改行しているのでしょうか?

文字列の一定部分を取り出す関数「substr」を使えばもっと簡単にできると思いますよ。
この関数は文字列を取り出す位置と取り出す長さが指定できます。

$message = "012345";
$line1 = substr($message,0,3); 0+0番目から3文字
$line2 = substr($message,3,3); 0+3番目から3文字

表示結果は$line1が012、$line2が345になります。
<BR>と表組み、ループ処理などを組み合わせればできそうですね。
また、表組み<table><tr><td>は左上から書かれてしまうので、文章の各行のデータを配列にしてreverseし、文章の終わりの行から表にするなどの工夫が必要でしょう。

縦書きCGIは作ったことがありませんが、質問文を見てパッと思ったのはこの方法です。
ご存知とは思いますが、プログラミングは十人十色。
あくまでも参考ということで、自信なし。
    • good
    • 0
この回答へのお礼

私の書いていたものは、半角英数字が繋がってある場合、○文字目に<br>を入れる、というかたちになっています。

なんと、substrも知っていましたがこれが使えるとは!
考え付きませんでした’’!)

まだ縦書きに成功していませんが、是非参考にさせて頂きます!
色々と試してみたいと思います。有難うございました!!

お礼日時:2003/03/10 10:02

こんな感じでどうでしょう?



-------------------------------------------------

# 縦書きにする文字列
$str = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわおん';

# 折り返す文字数
$end_line = 5;

# $str を文字単位に分割して配列 @chars に代入する
# http://www.din.or.jp/~ohzaki/perl.htm#JP_Split(Perlメモ)
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = $str =~ /$ascii|$twoBytes|$threeBytes/og;

# 一つ一つの文字に<br>を付け加えながら%kaに5文字ずつ代入
foreach(@chars){
$_ .= "<br>";
if(($i % $end_line)==0){$d++;}
$ka{$d} .= $_;
$i++;
}

# 行数
$h = int($i / $end_line);
if(($i % $end_line) > 0){$h++;}

print "Content-type: text/html\n\n";
print '<meta http-equiv="content-type" content="text/html; charset=euc">';
print "<table>\n<tr>\n";

for($g=$h;$g>0;$g--){
print "<td valign=\"top\" align=\"center\" width=\"1\">$ka{$g}</td>\n";
}

print "\n</tr>\n</table>";

-------------------------------------------------

TABLEの余白を広げたり、スタイルを使うともっときれいに表示されると思いますよ。もちろん文字コードはEUCじゃないとちゃんと動きません^^
あとnatsuki_tkさんの言う通り半角は全角にしてあげるともっときれいになると思います。

参考URL:http://www.din.or.jp/~ohzaki/perl.htm
    • good
    • 0

IEのみならHTMLで、またCSSを使っても縦表示できますが、


全ブラウザ対応を考えると難しいですよね(^^;

簡単なアドバイス程度ですが、
・半角文字→全角に変換 (縦に半角と全角が混じると変なので)
(jcode等を使えば半角カナ等の変換ルーチン利用できます)

・一文字ずつ区切って<br>をいれる。
簡単に、$line = join("<br>",split("",$line));
という雰囲気でできるとおもいます。

また、どの程度まで対応させるか難しいですが、
・記号類変換(カギ括弧など)
も見栄えを考えたら必要かと思います。

改行もテーブルに任せたいですが、やはり崩れてしまうと思います。
15文字目で次の行に移す方法ですが、
・一文字ずつの配列にしてしまってから、インデックス値を操作
 →split("",$line);を使う
・substr関数で切っていく
・正規表現
 →数字をカンマで区切るような方式で
などが考えられると思います(一つ目が一番簡単でしょう)

大変だとは思いますが、頑張ってください。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
一文字ずつ区切って<br>を入れる方法、そんな短い書き方でいけるとは!感動です
そして改行をテーブルにすると崩れるとの事・・・
全然知りませんでした^^;)

まだ作成中で縦書きはできていませんが、一歩所か数歩前進しました!
本当にありがとうございます!頑張ります!

お礼日時:2003/03/10 09:55

もし、スタイルシートを使ってもいいのなら



<div style="writing-mode:lr-tb">縦書き<br>になります。</div>

といったことができます。

ご参考までに
    • good
    • 0
この回答へのお礼

スタイルシートでもできるんですよね~
でもやっぱりNNでは効かないのでなんとかスタイルシート意外で頑張ってみたいと思います
ありがとうございました

お礼日時:2003/03/10 09:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!