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

PHP PHP
スポンサーリンク

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

「最大文字数チェック」が「長すぎないか?」を見るのに対して、
「最小文字数チェック」はこうです。

入力された文字列が「○文字以上あるか?」をチェックして、
短すぎたらエラーにしたい。

例えば、

  • パスワードは 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文字未満 → 短すぎる
}
PHP

mb_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

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

  1. mb_strlen で「今の文字数」を数える
  2. 最小文字数 $min と比べる
  3. 足りなければエラーメッセージを出す

これだけで、「短すぎないか?」を正しく判定できます。

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

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

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