3.

文字列の長さチェック

編集
この記事の要点
  • Laravel で文字列長をチェックする方法
  • バリデーション: 'name' => 'required|min:3|max:100'
  • min:N / max:N: 文字数指定(マルチバイト対応)
  • バイト数: size:N
  • PHP 標準: strlen() (バイト) / mb_strlen() (文字)

 

Laravel バリデーション

// FormRequest
public function rules()
{
    return [
        'name' => 'required|string|max:100',           // 100 文字以内
        'username' => 'required|min:3|max:30',         // 3-30 文字
        'description' => 'nullable|string|max:500',
        'tag' => 'required|size:5',                     // ちょうど 5 文字
        'phone' => 'required|regex:/^[0-9]{10,11}$/',  // 10-11 桁の数字
    ];
}

// コントローラ
$request->validate([
    'title' => 'required|max:200',
    'content' => 'required|max:65535',  // TEXT カラム
]);

// カスタムメッセージ
public function messages()
{
    return [
        'name.max' => '名前は :max 文字以内で入力してください',
        'name.min' => '名前は :min 文字以上で入力してください',
    ];
}

主要バリデーションルール

ルール意味
min:N最小 N 文字 (文字列) / 最小値 N (数値)
max:N最大 N 文字 (文字列) / 最大値 N (数値)
size:Nちょうど N 文字
between:min,maxmin 〜 max 文字
digits:NN 桁の数字
digits_between:min,maxmin 〜 max 桁の数字

PHP 標準関数

 100) { ... }  // ❌ 日本語だと予期しない結果
if (mb_strlen($name) > 100) { ... }  // ✅ 正確に文字数

JavaScript での文字列長

// length プロパティ (基本)
"Hello".length;             // 5
"こんにちは".length;          // 5 (UTF-16 コードユニット数)
"𝄞".length;                  // 2 (サロゲートペア)

// 正確な文字数 (Unicode コードポイント)
[..."𝄞"].length;             // 1
Array.from("𝄞").length;     // 1

// バイト数 (UTF-8)
new Blob([str]).size;        // 正確な UTF-8 バイト数
new TextEncoder().encode(str).length;  // 同上

// 実例
const text = "Hello, 世界! 🌍";
console.log(text.length);                       // 12
console.log([...text].length);                  // 11 (絵文字 1 つ)
console.log(new TextEncoder().encode(text).length);  // 18 (UTF-8 バイト)

フロント側のリアルタイム文字数表示


0 / 100




DB カラム制約

-- VARCHAR(100): 最大 100 文字
CREATE TABLE users (
    name VARCHAR(100) NOT NULL
);

-- CHECK 制約 (より厳密、PostgreSQL/SQL Server)
CREATE TABLE users (
    name VARCHAR(100) NOT NULL CHECK (CHAR_LENGTH(name) >= 3)
);

-- MySQL でも 8+ で CHECK 制約サポート
CREATE TABLE users (
    name VARCHAR(100) NOT NULL CHECK (CHAR_LENGTH(name) BETWEEN 3 AND 100)
);

-- 注意: VARCHAR は「文字数」、CHAR_LENGTH も「文字数」
-- LENGTH() はバイト数 (区別に注意)

UTF-8 ストレージサイズの理解

文字種UTF-8 バイト数
ASCII (英数字 / 記号)1 バイトA, 0, !
ラテン拡張 (アクセント文字等)2 バイトé, ñ
日本語・中国語・韓国語3 バイトあ, 漢, 한
絵文字・補助平面4 バイト😀, 🌍

MySQL の utf8mb4 文字セット使用時、VARCHAR(100) = 最大 400 バイト。

正規表現での検証

// 半角英数字 5-20 文字
'username' => 'required|regex:/^[a-zA-Z0-9]{5,20}$/'

// 日本語 1-30 文字
'name' => 'required|regex:/^[ぁ-んァ-ヶ一-龯]{1,30}$/u'

// 電話番号 (ハイフン区切り or なし)
'phone' => 'required|regex:/^0\d{1,4}-?\d{1,4}-?\d{4}$/'

// 郵便番号
'zip' => 'required|regex:/^\d{3}-?\d{4}$/'

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 入力データの保持
  2. 必須チェック
  3. 文字列の長さチェック
  4. 存在チェック
  5. 一意チェック
  6. 日本語化