| この記事の要点 |
|---|
|
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,max | min 〜 max 文字 |
digits:N | N 桁の数字 |
digits_between:min,max | min 〜 max 桁の数字 |
PHP 標準関数
<?php
// バイト数 (英数字なら文字数と同じ)
strlen("Hello"); // → 5
strlen("こんにちは"); // → 15 (UTF-8 で 3 バイト × 5)
// 文字数 (マルチバイト対応、推奨)
mb_strlen("Hello"); // → 5
mb_strlen("こんにちは"); // → 5
mb_strlen("こんにちは", "UTF-8");
// バイト数を mb_strlen でも取れる
mb_strlen($str, "8bit"); // → strlen と同じ
// よくある誤用
if (strlen($name) > 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 バイト)
フロント側のリアルタイム文字数表示
<input type="text" id="title" maxlength="100">
<span id="count">0 / 100</span>
<script>
const input = document.getElementById("title");
const count = document.getElementById("count");
input.addEventListener("input", () => {
const len = [...input.value].length; // 正確な文字数
count.textContent = `${len} / 100`;
if (len >= 100) {
count.style.color = "red";
} else if (len >= 80) {
count.style.color = "orange";
} else {
count.style.color = "";
}
});
</script>
<!-- Vue.js -->
<template>
<input v-model="text" maxlength="100">
<span :class="{ 'text-danger': text.length >= 100 }">
{{ text.length }} / 100
</span>
</template>
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}$/'
関連記事
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09