PHP Tips | 文字列処理:文字数・切り出し – 最大文字数チェック

PHP PHP
スポンサーリンク

「最大文字数チェック」がやりたいこと

やりたいことはシンプルです。

入力された文字列が「○文字以内かどうか」をチェックして、
長すぎたらエラーにしたい。

例えば、

  • ニックネームは 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
PHP

mb_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

ここでやっていることはシンプルです。

  1. mb_strlen で「今の文字数」を数える
  2. 最大文字数 $max と比べる
  3. 超えていたらエラーメッセージを作る

これだけで、「人間の感覚どおりの最大文字数チェック」ができます。

エンコーディングは必ず明示する

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バイトまで」と決まっている

この場合は、「最大バイト数チェック」が別途必要になります。
そのときは strlenmb_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

タイトルとURLをコピーしました