バリデーション

ばりでーしょん / Validation

作成日: 2026-01-13 | 最終更新: 2026-01-13

概要

バリデーション(Validation)とは、入力されたデータが正しい形式・内容かをチェックする仕組みです。 「検証」「妥当性確認」とも呼ばれます。

例えば、メールアドレス入力欄に「abc」と入力された場合、 「@」が含まれていないため、バリデーションエラーとして「正しいメールアドレスを入力してください」と表示します。

なぜバリデーションが必要?

バリデーションはフールプルーフ(誤操作防止)を実現する重要な手段です。

  • ユーザーの入力ミスを防ぐ:送信後に「エラーでした」と言われるストレスを軽減
  • システムエラーを防ぐ:不正なデータがデータベースに保存されるのを防止
  • セキュリティ対策:SQLインジェクション、XSSなどの攻撃を防ぐ
  • データの整合性:統一された形式でデータを管理

バリデーションの種類

1. クライアントサイドバリデーション

ブラウザ上で即座にチェックする方法。ユーザー体験が向上します。

  • HTML5の標準機能:required、type、pattern属性など
  • JavaScript:カスタムバリデーションロジック

2. サーバーサイドバリデーション

サーバーで厳密にチェックする方法。セキュリティ上必須です。

  • クライアント側のチェックを回避した悪意ある入力を防ぐ
  • データベースに保存する前の最終チェック

💡 ベストプラクティス:クライアントとサーバーの両方でバリデーションを実装します。

体験してみよう:リアルタイムバリデーション

実際にフォームに入力して、バリデーションがどのように動作するか体験してみましょう。 入力中にリアルタイムでエラーチェックが実行されます。

リアルタイムバリデーションデモ

各項目を入力してみてください。リアルタイムでバリデーションが実行されます。

💡 ポイント:正しい入力には緑色のチェックマーク、エラーには赤色の警告が表示されます。 これがフールプルーフ(誤操作防止)の実装例です。

実装例:HTML5バリデーション

HTMLの標準機能を使った最もシンプルな実装方法です。

サンプルコードを見る (HTML)
<!-- メールアドレスのバリデーション -->
<input type="email" required
       placeholder="example@example.com">

<!-- 数値のバリデーション(範囲指定) -->
<input type="number" min="1" max="100" required>

<!-- 電話番号のバリデーション(パターン指定) -->
<input type="tel"
       pattern="[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}"
       placeholder="03-1234-5678">

<!-- パスワードのバリデーション(最小文字数) -->
<input type="password" minlength="8" required>

<!-- URLのバリデーション -->
<input type="url" placeholder="https://example.com">

実装例:JavaScriptバリデーション

JavaScriptを使ったカスタムバリデーションの例です。

サンプルコードを見る (JavaScript)
function validateEmail(email) {
  // メールアドレスの正規表現パターン
  const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

  if (!pattern.test(email)) {
    return {
      valid: false,
      message: '正しいメールアドレスを入力してください'
    };
  }

  return { valid: true };
}

function validatePassword(password) {
  if (password.length < 8) {
    return {
      valid: false,
      message: 'パスワードは8文字以上にしてください'
    };
  }

  // 英数字を含むかチェック
  if (!/[a-zA-Z]/.test(password) || !/[0-9]/.test(password)) {
    return {
      valid: false,
      message: 'パスワードは英字と数字を含めてください'
    };
  }

  return { valid: true };
}

// フォーム送信時にバリデーション
document.querySelector('form').addEventListener('submit', (e) => {
  const email = document.querySelector('#email').value;
  const password = document.querySelector('#password').value;

  const emailResult = validateEmail(email);
  const passwordResult = validatePassword(password);

  if (!emailResult.valid || !passwordResult.valid) {
    e.preventDefault(); // 送信を中止
    alert(emailResult.message || passwordResult.message);
  }
});

よくあるバリデーションルール

項目バリデーションルール
メールアドレス@を含む、ドメイン形式user@example.com
パスワード8文字以上、英数字含むPass1234
電話番号数字とハイフン03-1234-5678
郵便番号7桁の数字(ハイフンあり/なし)123-4567
URLhttp://またはhttps://で開始https://example.com
日付YYYY-MM-DD形式、有効な日付2026-01-13
クレジットカード番号13〜19桁の数字、Luhnアルゴリズム4111-1111-1111-1111

よくある失敗例とその対策

バリデーション実装で陥りがちな失敗例と、その対策方法を表で整理しました。

失敗例問題点対策
❌ クライアントサイドのみJavaScriptを無効化するとバリデーションが回避される必ずサーバーサイドでも検証
クライアント=体験向上、サーバー=セキュリティ
❌ 曖昧なエラーメッセージ「エラーが発生しました」では修正方法が分からない具体的に指摘
例:「メールアドレスに@が含まれていません」
❌ パスワードが厳しすぎる「大文字・小文字・数字・記号・12文字以上」で離脱率が上がる8文字以上+英数字程度に留める
または強度メーターを表示
❌ 送信後にまとめて表示全部入力してから「5箇所エラー」と言われるとストレスリアルタイムバリデーションで入力直後に表示
❌ 正規表現のミス先頭(^)と末尾($)のチェックがないと部分一致で通る^と$で囲む
例:/^[0-9]+$/
正規表現の具体例を見る
// ❌ 悪い例:先頭と末尾のチェックがない
const badPattern = /@/;
// "abc@def@ghi" もマッチしてしまう

// ✅ 良い例:^と$で囲む
const goodPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

// ❌ 悪い例:数字のみのチェックが甘い
const badNumber = /[0-9]+/;
// "abc123def" もマッチしてしまう

// ✅ 良い例:^と$で囲む
const goodNumber = /^[0-9]+$/;

バリデーションのベストプラクティス

✅ 実装時のチェックリスト

  • リアルタイムフィードバック:入力中・フォーカスを外した瞬間にチェック
  • わかりやすいエラーメッセージ:「エラー」ではなく「メールアドレスの形式が正しくありません」
  • エラー箇所を明示:赤枠、アイコン、エラーメッセージを入力欄の近くに表示
  • 両側でバリデーション:クライアントとサーバーの両方で実装
  • ポジティブフィードバック:正しい入力には緑のチェックマークを表示
  • アクセシビリティ:エラーメッセージをスクリーンリーダーでも読めるように(aria-invalid、aria-describedby)

🚀 パフォーマンス最適化

リアルタイムバリデーションは便利ですが、入力のたびに処理が実行されるため、 重い処理(API呼び出しなど)はdebounce(遅延実行)を使います。

debounceの実装例を見る (JavaScript)
function debounce(func, wait) {
  let timeout;
  return function(...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

// 使用例:500ms後に実行
const validateWithDebounce = debounce((value) => {
  // 重い処理(API呼び出しなど)
  console.log('バリデーション実行:', value);
}, 500);

input.addEventListener('input', (e) => {
  validateWithDebounce(e.target.value);
});

実務でよく使うバリデーション実装

1. クレジットカード番号のバリデーション(Luhnアルゴリズム)

クレジットカード番号は単なる数字チェックではなく、Luhnアルゴリズムという チェックサム検証を使います。

Luhnアルゴリズムの実装を見る (JavaScript)
function validateCreditCard(cardNumber) {
  // ハイフンやスペースを削除
  const digits = cardNumber.replace(/[^0-9]/g, '');

  // 13〜19桁でないとエラー
  if (digits.length < 13 || digits.length > 19) {
    return false;
  }

  // Luhnアルゴリズム
  let sum = 0;
  let isEven = false;

  for (let i = digits.length - 1; i >= 0; i--) {
    let digit = parseInt(digits[i]);

    if (isEven) {
      digit *= 2;
      if (digit > 9) {
        digit -= 9;
      }
    }

    sum += digit;
    isEven = !isEven;
  }

  return sum % 10 === 0;
}

// テスト
console.log(validateCreditCard('4111-1111-1111-1111')); // true
console.log(validateCreditCard('1234-5678-9012-3456')); // false

2. 郵便番号から住所を自動入力

日本の郵便番号(7桁)をバリデーションし、APIで住所を取得して自動入力する実装です。

郵便番号バリデーション+自動入力の実装を見る (JavaScript)
async function validateAndFillAddress(postalCode) {
  // 郵便番号のバリデーション(7桁の数字)
  const pattern = /^[0-9]{7}$/;
  const cleanedCode = postalCode.replace(/-/g, '');

  if (!pattern.test(cleanedCode)) {
    return {
      valid: false,
      message: '郵便番号は7桁の数字で入力してください'
    };
  }

  try {
    // 郵便番号APIで住所を取得
    const response = await fetch(
      `https://zipcloud.ibsnet.co.jp/api/search?zipcode=${cleanedCode}`
    );
    const data = await response.json();

    if (data.results) {
      const address = data.results[0];
      return {
        valid: true,
        prefecture: address.address1,
        city: address.address2,
        town: address.address3
      };
    } else {
      return {
        valid: false,
        message: '該当する住所が見つかりませんでした'
      };
    }
  } catch (error) {
    return {
      valid: false,
      message: '住所の取得に失敗しました'
    };
  }
}

3. パスワード強度メーター

厳しいバリデーションルールの代わりに、パスワード強度を視覚化する方法です。

パスワード強度メーターの実装を見る (JavaScript)
function calculatePasswordStrength(password) {
  let strength = 0;

  // 長さによる加点
  if (password.length >= 8) strength += 1;
  if (password.length >= 12) strength += 1;
  if (password.length >= 16) strength += 1;

  // 文字種による加点
  if (/[a-z]/.test(password)) strength += 1;  // 小文字
  if (/[A-Z]/.test(password)) strength += 1;  // 大文字
  if (/[0-9]/.test(password)) strength += 1;  // 数字
  if (/[^a-zA-Z0-9]/.test(password)) strength += 1;  // 記号

  // 強度を判定
  if (strength <= 2) return { level: 'weak', label: '弱い', color: '#dc3545' };
  if (strength <= 5) return { level: 'medium', label: '普通', color: '#ffc107' };
  return { level: 'strong', label: '強い', color: '#28a745' };
}

// 使用例
const password = 'MyP@ssw0rd';
const result = calculatePasswordStrength(password);
console.log(`パスワード強度: ${result.label}`);
// 強度バーを表示
document.getElementById('strength-bar').style.width =
  `${(result.strength / 7) * 100}%`;
document.getElementById('strength-bar').style.backgroundColor = result.color;

関連用語

用語名説明関係性
フールプルーフ誤操作を未然に防ぐ設計思想バリデーションはフールプルーフを実現する手段の1つ
ポカヨケ製造業におけるヒューマンエラー防止の仕組みバリデーションはIT版のポカヨケ
HTMLWebページの構造を作る言語HTML5の標準バリデーション機能が使える
JavaScriptWebページに動きを付ける言語カスタムバリデーションを実装できる
Cookieブラウザにデータを保存する仕組み入力データの一時保存に使える
LocalStorageブラウザにデータを永続保存フォーム入力の下書き保存に使える
API外部サービスとの連携窓口郵便番号APIでの住所バリデーションなど