PHPで指定するサイズ(幅px × 高さpx)枠に文字を表示させ、その枠内に納まらない場合は「...」表示するプログラムを作成したいと思います。1文字12pxとします。


文字数はmb_strlenで取得し、文字のカットはmb_substrを使うまではわかっているのですが、
肝心の上記計算式がわかりません。

参考になるサイトや考え方を教えて下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/12 01:24:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:mattn No.1

回答回数104ベストアンサー獲得回数23

ポイント35pt

文字の大きさとなるフォントにより結果が異なります。

実際にそのフォントで描いた場合にどの様に表示されるかについては、それ相応のAPIを使わないと分かりませんが

方法としては2つあります。


まず計算で出す方法。

  • フォント名を固定幅(monospace等)にする
  • フォントの大きさを
表示させたい幅 / 表示させたい文字数

となるようにする。

  • 文字数分ループしてそれぞれのユニコード値を取得し、その幅を合計する。(wcwidthというC言語のソースが参考になります)
  • フォントの大きさを掛け、表示幅内に収まる位置でループ終了。


次にGDを使う方法。

この値が正しく戻るか分かりませんが、こんなAPIがあります。

http://php.net/manual/en/function.imagettfbbox.php

これで描いたボックスの大きさが、指定の範囲内になるよう文字列を減らしながら調整する。

id:kt26

表示させたい文字数が決まっていなくて、指定枠に収まるよう文字列を自動リサイズさせたいのが、質問の意図です。

それを実現する為の、諸々の情報を期待していたのですが、質問の仕方が悪くて誤解を招きました。すみません。

2009/12/06 02:15:38
id:d_jumpei No.2

回答回数2ベストアンサー獲得回数0

ポイント35pt

$hyouji_text = "";

$text = "てきすと、、、";

$leader = "…";

$w=$h=12;

$width=幅;

$height=高さ;

$cols = floor( $width / $w );//一行の最大文字数

$rows = floor( $height / $h );//最大行数

$maxlen = $cols * $rows;//最大文字数

$strlen = mb_strlen($text);//文章全体の文字数

if($strlen > $maxlen){

$hyouji_text = mb_substr($text,0,($maxlen-1).$leader);

}else{

$hyouji_text = $text;

}

こういうことでしょうか。。。

改行とか考えてませんが。

ご参考までに。

  • id:Reiaru
    PHP という事は恐らくは Web 上のフォーム (textarea 等) ですよね。
    例えそれが等幅フォントを使うという前提であったとしても、結構とずれが生じる可能性がありますので、
    Web 上ではあまりその様な処理は行わない方が良いのではないかと思います。

    単純にロジックだけを考えるならば簡単です。

    よく見かけるVBサンプル集 MENU 10~19 - 長いフルパスのファイル名を「...」で省略する
    http://suvaru.com/pg/sampl/Sample100_10.html

    でも何でも良いですが、ごく単純な計算でそれが成り立っています。
    文字数からその幅を計算し、収まらないとなった時に文末を切り捨てて最後に ... を付加すれば良いだけですから (... の分は引いて)。

    もしかするともう少し高度なお話なのかもしれません。
    例えば相手のインストールされているフォントを調べて処理分岐するであるとか (Windows 上ならともかく、PHP で可能でしょうか?)。
    そうなってきますとそれが可能であるかどうか等々、その辺りから検討しないといけなくなってくる様な気がします。
  • id:kt26
    WEB上のフォームではないですね。単に表示の問題です。

    少々、質問の意図が伝わりづらい書き方をしてしまったかもしれません。
    指定文字数で区切って...を出す方法はわかっているので
    表示枠・高さで自動調節する方法を知りたかったのですが、
    確かに閲覧している環境に寄りますから簡単にはいきませんよね。

    ただ自分で調べたところ、文字の大きさはCSSである程度統一出来るみたいです。
    YAHOOが提供しているYUI 2: Fonts CSSを使えばブラウザに依存せずに
    文字の大きさを統一できるみたいです。
  • id:Mars
    それは、例えばphpではなにもせずにJavascriptで実現する方法でもアリですか?
    表示上の大きさとかはクライアント側の問題なんでクライアント側のスクリプトで対応させた方が楽かも。
  • id:kt26
    可能であればPHPでやりたいです。無理ならこの機能自体を諦めようと思っています。
  • id:Mars
    phpのみでしたか。(携帯サイト??)
    Javascriptでサンプル書いてて気付いたんですが、英単語が折り返し部分に掛かるときは改行のタイミングが変わったりして単純計算では出せないし結構大変そうです。
    cssのtext-overflow:ellipsis;がもうちょっと使える仕様だと良かったんでしょうけど。
    元々phpは素人同然だし私は脱落です。失礼しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません