💡 今日の3行まとめ
- 日本語を含む文字数を数えるときは
strlen()ではなくmb_strlen()を使う strlen()は「バイト数」を返すため、UTF-8の日本語1文字が3と計算されてしまう上限文字数 - mb_strlen($文字列)を計算すれば、「あと何文字入力できるか」も1行で表示できる
1. 今日のお題とゴール
プロフィールの一言コメント(上限20文字)の文字数を数え、制限以内かどうかと「残り文字数」を画面に出力します。
- コメント
"PHPの配列と文字列を練習中!"(15文字)の文字数を正確に取得する - 上限(
20文字)以内ならOK、超えていたらNGと判定する - 現在の文字数と、あと何文字入力できるかを出力する
// 期待する出力例
文字数: 15文字(上限20文字)
判定: OK(あと5文字入力できます)
2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード
❌ やりがちなNGコードBefore
<?php
$comment = 'PHPの配列と文字列を練習中!'; // 15文字
$length = strlen($comment); // ← 日本語が3倍で数えられ「39」になる!
if ($length <= 20) {
echo "OK({$length}文字)\n";
} else {
echo "NG:文字数オーバーです({$length}文字)\n";
}
strlen() は文字数ではなくデータの「バイト数」を数える関数です。UTF-8の日本語は1文字あたり3バイトあるため、たった15文字でも「39文字オーバー」と誤判定されてしまいます。
⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);
// 1. 入力されたコメントと上限文字数を用意する
$comment = 'PHPの配列と文字列を練習中!';
$maxLength = 20;
// 2. mb_strlen() で日本語も「1文字=1」として正確に数える
$length = mb_strlen($comment);
$remaining = $maxLength - $length;
// 3. 文字数と判定結果をわかりやすく出力する
echo "文字数: {$length}文字(上限{$maxLength}文字)\n";
if ($length === 0) {
echo "判定: NG(コメントを入力してください)\n";
} elseif ($remaining >= 0) {
echo "判定: OK(あと{$remaining}文字入力できます)\n";
} else {
$over = abs($remaining);
echo "判定: NG({$over}文字オーバーしています)\n";
}
3. ここだけ押さえる!3つのポイント
1日本語を扱うなら
mb_strlen() を選ぶ先頭に mb_(マルチバイト)がつく関数は、ひらがなや漢字も英数字と同じ「1文字」として数えてくれます。フォーム入力やDB保存前の文字数チェックでは、常に mb_strlen() を使いましょう。
2
strlen() は半角英数字やバイト容量のチェック用strlen() は文字の見た目ではなく「何バイトのデータか」を返す関数です。日本語が混じるテキストに使うと約3倍の数値になるため、画面の文字数カウントには向いていません。
3
上限 - 文字数 で残り文字数と超過数を両方出せる$maxLength - $length を計算しておけば、結果が0以上なら「残り文字数」、マイナスなら「超過した文字数」としてそのまま使えます。マイナス符号を消したいときは abs() で絶対値にすると表示がきれいになります。
4. 1分ミニチャレンジ
🚀 手を動かしてみよう
正解コードの $maxLength = 20; を $maxLength = 10; に書き換えて実行してみましょう。判定が NG(5文字オーバーしています) に切り替わることが確認できます。