「最大文字数チェック」がやりたいこと
やりたいことはシンプルです。
入力された文字列が「○文字以内かどうか」をチェックして、
長すぎたらエラーにしたい。
例えば、
- ニックネームは 30文字まで
- 自己紹介は 200文字まで
- タイトルは 50文字まで
といった制限を、コードでちゃんと判定したい——これが「最大文字数チェック」です。
ここで一番大事なのは、
「文字数」をちゃんと「人間の感覚どおり」に数えること
です。
つまり、日本語を含むなら strlen() ではなく mb_strlen() を使う、という話になります。
なぜ strlen() ではダメなのか
strlen は「文字数」ではなく「バイト数」
まず、よくある失敗例から。
$name = "こんにちは";
echo strlen($name); // 15(UTF-8 の場合)
PHP「こんにちは」は 5文字ですが、strlen() は 15 を返します。
UTF-8 では日本語 1文字が 3バイトなので、5 × 3 = 15 になってしまうわけです。
もし、最大 10文字の制限をこう書いてしまうと、
if (strlen($name) > 10) {
// 長すぎると判定されてしまう
}
PHP「5文字なのに長すぎる」と判定されてしまいます。
ユーザーからすると「は?」となるやつです。
mb_strlen は「文字数」を返してくれる
正しくは、こう書きます。
$name = "こんにちは";
echo mb_strlen($name, 'UTF-8'); // 5
PHPmb_strlen() は、指定したエンコーディングに従って「文字数」を数えてくれます。
UTF-8 なら、日本語も英字も「1文字は1」としてカウントされます。
最大文字数チェックをするときは、必ず mb_strlen() を使うのが鉄則です。
最大文字数チェックの基本形
まずは素直なバリデーション例
例えば、「自己紹介は 200文字まで」というルールを作りたいとします。
$bio = $_POST['bio'] ?? '';
$max = 200;
$length = mb_strlen($bio, 'UTF-8');
if ($length > $max) {
$error = "自己紹介は{$max}文字以内で入力してください。(現在:{$length}文字)";
}
PHPここでやっていることはシンプルです。
mb_strlenで「今の文字数」を数える- 最大文字数
$maxと比べる - 超えていたらエラーメッセージを作る
これだけで、「人間の感覚どおりの最大文字数チェック」ができます。
エンコーディングは必ず明示する
mb_strlen($bio, 'UTF-8');
PHPここで 'UTF-8' を省略することもできますが、実務では明示した方が安全です。
- プロジェクト全体の文字コードは UTF-8 に統一する
mb_strlenには'UTF-8'を必ず渡す
この2つをセットで「お約束」にしてしまうと、環境差によるバグを防げます。
ユーティリティ関数としてまとめる
共通関数にしておくと楽になる
毎回同じようなコードを書くのは面倒なので、
「最大文字数チェック」を関数にしておくと便利です。
/**
* 最大文字数チェック(UTF-8 前提)
*
* @param string $text 対象文字列
* @param int $max 最大文字数
* @return bool true: OK(範囲内) / false: NG(超えている)
*/
function isWithinMaxLength(string $text, int $max): bool
{
return mb_strlen($text, 'UTF-8') <= $max;
}
PHP使い方はこうなります。
$bio = $_POST['bio'] ?? '';
if (!isWithinMaxLength($bio, 200)) {
$error = "自己紹介は200文字以内で入力してください。";
}
PHPこの関数を一つ用意しておくだけで、
- ニックネーム
- タイトル
- コメント
- メモ
など、あらゆる入力項目の最大文字数チェックを、同じ書き方で統一できます。
実務での具体的なシチュエーション例
例題1:フォームのサーバーサイドバリデーション
ユーザー登録フォームを考えます。
- ニックネーム:30文字まで
- 自己紹介:200文字まで
という仕様にしたい場合。
$nickname = $_POST['nickname'] ?? '';
$bio = $_POST['bio'] ?? '';
$errors = [];
if (!isWithinMaxLength($nickname, 30)) {
$len = mb_strlen($nickname, 'UTF-8');
$errors[] = "ニックネームは30文字以内で入力してください。(現在:{$len}文字)";
}
if (!isWithinMaxLength($bio, 200)) {
$len = mb_strlen($bio, 'UTF-8');
$errors[] = "自己紹介は200文字以内で入力してください。(現在:{$len}文字)";
}
PHPここでのポイントは、
- 「チェックのロジック」は
isWithinMaxLengthに閉じ込める - エラーメッセージの文言だけ、項目ごとに変える
という分離です。
こうしておくと、後から「最大文字数のルール」を変えたくなったときも、
ロジック側とメッセージ側をそれぞれ落ち着いて直せます。
例題2:DB カラムの制約と合わせる
データベース側で、例えば VARCHAR(100) のカラムがあるとします。
このとき、「100文字まで」と思い込むのは危険です。
- DB の文字コードが UTF-8 なら、「100文字」ではなく「100バイト」の制約になっている場合もある
- アプリ側は「文字数」で制限したいことが多い
ここは設計の話になりますが、実務ではこう決めてしまうのが楽です。
- DB の文字コードも UTF-8 にする
- カラムの長さは「文字数ベース」で余裕を持って決める(例:
VARCHAR(255)) - アプリ側で「最大文字数チェック」をきっちりやる
つまり、「DB にギリギリまで詰め込む」のではなく、
「アプリ側でちゃんと制限して、DB は余裕を持たせる」方針です。
「最大文字数」と「バイト数」の違いを整理しておく
文字数でチェックする場面
- ユーザーが読むテキスト(ニックネーム、タイトル、本文など)
- 「○文字以内で入力してください」と表示したい場面
ここは必ず「文字数」で考えます。
つまり、mb_strlen ベースのチェックです。
バイト数でチェックする場面
- 外部システムとの連携仕様が「バイト数」で決まっている
- 固定長ファイルや古いプロトコルで「20バイトまで」と決まっている
この場合は、「最大バイト数チェック」が別途必要になります。
そのときは strlen や mb_strcut を使う話になりますが、
それはもう「別のユーティリティ」として切り分けるのがきれいです。
ちょっとした工夫:エラーメッセージを親切にする
「現在:○文字」を出してあげる
ユーザーにとって親切なのは、
「ダメです」だけでなく、「今何文字なのか」も教えてあげること
です。
$max = 200;
$len = mb_strlen($bio, 'UTF-8');
if ($len > $max) {
$error = "自己紹介は{$max}文字以内で入力してください。(現在:{$len}文字)";
}
PHPこうしておくと、ユーザーは
- 「あとどれくらい削ればいいか」
- 「どれくらいオーバーしているか」
を感覚的に掴みやすくなります。
まとめ:今日からの「最大文字数チェック」の基準
ポイントだけギュッとまとめます。
- 日本語を含む文字列の最大文字数チェックは、必ず
mb_strlen($text, 'UTF-8')を使う。 - 「○文字以内か?」は、
mb_strlen(...) <= 最大文字数で判定する。 - 共通ユーティリティとして
isWithinMaxLength()のような関数を用意しておくと、プロジェクト全体で統一しやすい。
実務ユーティリティとしては、これくらいの関数を一つ置いておくとかなり使い回せます。
function isWithinMaxLength(string $text, int $max): bool
{
return mb_strlen($text, 'UTF-8') <= $max;
}
PHP