「最小文字数チェック」がやりたいこと
「最大文字数チェック」が「長すぎないか?」を見るのに対して、
「最小文字数チェック」はこうです。
入力された文字列が「○文字以上あるか?」をチェックして、
短すぎたらエラーにしたい。
例えば、
- パスワードは 8文字以上
- ニックネームは 2文字以上
- 自己紹介は 10文字以上
といった「下限」を決めたいときに使います。
ここでも一番大事なのは、
日本語を含むなら、必ず「文字数」を
mb_strlen()で数えること
です。
なぜ strlen() ではなく mb_strlen() なのか
strlen は「バイト数」なのでズレる
まず、よくある落とし穴から。
$password = "あいうえお";
echo strlen($password); // 15(UTF-8 の場合)
echo mb_strlen($password); // 5
PHP「5文字」のつもりが、strlen() だと 15 になります。
UTF-8 では日本語 1文字が 3バイトなので、5 × 3 = 15 です。
もし「パスワードは 8文字以上」として、こう書いてしまうと、
if (strlen($password) < 8) {
// 短すぎると判定されない(実際は5文字なのに)
}
PHP本当は「5文字で短い」のに、「15バイトあるからOK」と誤判定されてしまいます。
mb_strlen は「人間の感覚どおりの文字数」
正しくは、こう書きます。
$password = "あいうえお";
$len = mb_strlen($password, 'UTF-8'); // 5
if ($len < 8) {
// 8文字未満 → 短すぎる
}
PHPmb_strlen() は、UTF-8 の日本語でも「1文字は1」として数えてくれます。
最小文字数チェックでは、この「人間の感覚どおりの文字数」が欲しいので、
必ず mb_strlen() を使うのが前提になります。
最小文字数チェックの基本形
もっとも素直な書き方
例えば、「パスワードは 8文字以上」というルールを作りたいとします。
$password = $_POST['password'] ?? '';
$min = 8;
$length = mb_strlen($password, 'UTF-8');
if ($length < $min) {
$error = "パスワードは{$min}文字以上で入力してください。(現在:{$length}文字)";
}
PHPやっていることはシンプルです。
mb_strlenで「今の文字数」を数える- 最小文字数
$minと比べる - 足りなければエラーメッセージを出す
これだけで、「短すぎないか?」を正しく判定できます。
エンコーディングは必ず明示する
mb_strlen($password, 'UTF-8');
PHPここで 'UTF-8' を省略することもできますが、
実務では「プロジェクトは UTF-8 前提」「mb_* には必ず 'UTF-8' を渡す」と決めてしまうのが安全です。
ユーティリティ関数としてまとめる
共通関数にしておくと、全画面で使い回せる
毎回同じような if 文を書くのは面倒なので、
「最小文字数チェック」を関数にしておくと便利です。
/**
* 最小文字数チェック(UTF-8 前提)
*
* @param string $text 対象文字列
* @param int $min 最小文字数
* @return bool true: OK(足りている) / false: NG(足りない)
*/
function isOverMinLength(string $text, int $min): bool
{
return mb_strlen($text, 'UTF-8') >= $min;
}
PHP使い方はこうなります。
$password = $_POST['password'] ?? '';
if (!isOverMinLength($password, 8)) {
$len = mb_strlen($password, 'UTF-8');
$error = "パスワードは8文字以上で入力してください。(現在:{$len}文字)";
}
PHPこの関数を一つ用意しておけば、
- パスワード
- ニックネーム
- コメント
- メッセージ
など、あらゆる入力項目の「最小文字数チェック」を、同じ書き方で統一できます。
実務での具体的なシチュエーション例
例題1:パスワードの強度の最低ライン
パスワードは「短すぎると危険」なので、
最低でも 8文字、できれば 12文字以上などのルールを設けることが多いです。
$password = $_POST['password'] ?? '';
$errors = [];
if (!isOverMinLength($password, 8)) {
$len = mb_strlen($password, 'UTF-8');
$errors[] = "パスワードは8文字以上で入力してください。(現在:{$len}文字)";
}
PHPここで strlen() を使ってしまうと、
日本語や絵文字を含んだパスワードで判定が狂う可能性があります。
例題2:ニックネームは「1文字だけ」は禁止したい
「空じゃなければOK」だと、極端に短い入力も通ってしまいます。
例えば、「ニックネームは2文字以上」にしたい場合。
$nickname = $_POST['nickname'] ?? '';
if (!isOverMinLength($nickname, 2)) {
$len = mb_strlen($nickname, 'UTF-8');
$error = "ニックネームは2文字以上で入力してください。(現在:{$len}文字)";
}
PHPこれで、「a」「あ」のような 1文字だけの入力を弾けます。
「最小文字数」と「空文字チェック」の関係
空文字チェックだけでは足りないことが多い
よくあるパターンは、まずこうです。
if ($text === '') {
$error = "必須項目です。";
}
PHPこれは「入力されているかどうか」だけを見ています。
でも、実務ではそれだけでは足りないことが多いです。
- 「a」や「。」だけの入力は、実質的に意味がない
- 「最低限これくらいは書いてほしい」というラインを決めたい
そこで、「必須チェック」と「最小文字数チェック」を組み合わせます。
組み合わせの例
$comment = $_POST['comment'] ?? '';
$errors = [];
if ($comment === '') {
$errors[] = "コメントを入力してください。";
} elseif (!isOverMinLength($comment, 5)) {
$len = mb_strlen($comment, 'UTF-8');
$errors[] = "コメントは5文字以上で入力してください。(現在:{$len}文字)";
}
PHPこうすると、
- 未入力 → 「入力してください」
- 1〜4文字 → 「短すぎます」
という、より現実的なバリデーションになります。
「最小文字数」と「最大文字数」をセットで考える
両方チェックするのが普通
実務では、
- 最小文字数:短すぎないか
- 最大文字数:長すぎないか
の両方をチェックすることがほとんどです。
例えば、ニックネームなら、
- 最小:2文字以上
- 最大:30文字以内
という感じです。
$nickname = $_POST['nickname'] ?? '';
$min = 2;
$max = 30;
$len = mb_strlen($nickname, 'UTF-8');
if ($len < $min) {
$errors[] = "ニックネームは{$min}文字以上で入力してください。(現在:{$len}文字)";
} elseif ($len > $max) {
$errors[] = "ニックネームは{$max}文字以内で入力してください。(現在:{$len}文字)";
}
PHPここまで来ると、「最小文字数チェック」と「最大文字数チェック」はセットで一つの考え方として扱えます。
まとめ:今日からの「最小文字数チェック」の基準
押さえておきたいポイントをコンパクトにまとめます。
- 日本語を含む文字列の最小文字数チェックは、必ず
mb_strlen($text, 'UTF-8')を使う。 - 判定は「
mb_strlen(...) >= 最小文字数」で行う。 - 共通ユーティリティとして
isOverMinLength()のような関数を用意しておくと、プロジェクト全体で統一しやすい。 - 実務では「必須チェック」「最小文字数チェック」「最大文字数チェック」をセットで考えると自然になる。
ユーティリティとしては、これくらいの関数を一つ置いておくとかなり使い回せます。
function isOverMinLength(string $text, int $min): bool
{
return mb_strlen($text, 'UTF-8') >= $min;
}
PHP