無趣味の戯言

🖼️

PHPで禁則処理を強引にやる

こんにちは。だいちゃんです。

昨日 の続きです。

長過ぎる文字がはみ出ちゃう問題を修正してみよう。

結果

https://play.udcxx.me/24-text-on-image/?title=これでおそらく長い長いタイトルが入ってきてもちゃんとはみ出ずに表示できる

やったこと

指定文字数で改行するようにしました。

全体が60文字以内なら20文字ごとに、それ以上ならフォントサイズを20pxにしたうえで35文字ごとに改行するようにしています。

ついでに、禁則処理を入れて、英単語の途中とか、ひらがな・カタカナの小さい文字(「っ」とか)で改行されないようにしました。

$fontsize = 36;
$breakpoint = 20;

if (mb_strwidth($title, 'UTF-8') > 120) {
    // 全体が60文字(= 20文字 * 3行)以上ならフォントサイズ変更 + 改行位置も変更
    $fontsize = 20;
    $breakpoint = 35;
}

if (mb_strwidth($title, 'UTF-8') > $breakpoint * 2) {
    $max_count = mb_strwidth($title, 'UTF-8') / $breakpoint * 2;

    // 禁則処理に該当する文字
    $specialChars = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'ー', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ッ', 'ャ', 'ュ', 'ョ', 'ヮ', '、', '。', '(', ')', '「', '」', '【', '】', 'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'っ', 'ゃ', 'ゅ', 'ょ', 'ゎ'];

    $last_pos = 0;
    for ($count = 0; $count < $max_count; $count++) {
        for ($pos = $breakpoint + $last_pos; $pos > $last_pos; $pos--) {
            $char = mb_substr($title, $pos + 1, 1, 'UTF-8');

            if (!in_array($char, $specialChars)) {
                // 禁則処理に触れない = 改行OK
                $title = mb_substr($title, 0, $pos + 1)."\n".mb_substr($title, $pos + 1);
                $last_pos = $pos - 1;
                break;

            } else if ($pos === $last_pos) {
                // 禁則処理だらけなら強制改行しちゃお!
                $title = mb_substr($title, $last_pos, $last_pos + $breakpoint)."\n".mb_substr($title, $last_pos + 1);
                $last_pos = $pos;
                break;
            }
        }
    }
}

$angle = 0;

いろいろ試したわけではないけど、ある程度耐えられそうなところまできました。

ハマりポイントとしては、mb_strwidth() は全角文字を2としてカウントするけど、mb_substr() は全角文字も1でカウントしちゃう点ですかね。$breakpoint をいい感じに使いまわしたかったのに...

mb_strwidth() は文字の を返してるから仕方ないんだけど。


PHP苦手だけど、ドキュメントはしっかりしてるのがいいね。結構助けられてる。

Buy Me A Coffee