PHP 速習チュートリアル

PHP フォーム - メールと URL のバリデーション

1. 名前・メール・URL 検証の概要

この章では、ユーザーから入力された「名前」「メールアドレス」「URL」を検証(バリデーション)する方法について解説します。

Webアプリケーションにおいて、入力データの形式を正しくチェックすることは、データの整合性を保つだけでなく、セキュリティ上のリスクを軽減するためにも非常に重要です。

2. 名前のバリデーション

以下のコードは、名前フィールドが「アルファベット」「ダッシュ(-)」「アポストロフィ(')」「空白」のみを含んでいるかを確認するシンプルな方法です。名前フィールドの値が有効でない場合、エラーメッセージを格納します。

コード例:

$name = test_input($_POST["name"]);
// 正規表現でアルファベット、空白、一部の記号のみを許可
if (!preg_match("/^[a-zA-Z-' ]*$/", $name)) {
  $nameErr = "アルファベットと空白のみ許可されています";
}

preg_match() 関数は、文字列がパターンに一致するかどうかを検索し、一致すれば true を、そうでなければ false を返します。

3. メールアドレスのバリデーション

メールアドレスが正しい形式であるかを確認する、最も簡単かつ安全な方法は、PHP の filter_var() 関数を使用することです。

以下のコードでは、メールアドレスの形式が正しくない場合にエラーメッセージを格納します。

コード例:

$email = test_input($_POST["email"]);
// PHP 組み込みのフィルタを使用してメール形式を検証
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $emailErr = "不正なメール形式です";
}

4. URL のバリデーション

以下のコードは、URL アドレスの構文が有効かどうかをチェックする方法です(この正規表現は URL 内のダッシュも許可しています)。URL の構文が有効でない場合、エラーメッセージを格納します。

コード例:

$website = test_input($_POST["website"]);
// URLの形式を確認する正規表現
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website)) {
  $websiteErr = "不正なURL形式です";
}

5. 名前、メール、URL バリデーションの統合

これまでのロジックを統合したスクリプトは以下のようになります。

実装例:

<?php
// 変数を定義し、空の値で初期化
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  
  // 名前のチェック
  if (empty($_POST["name"])) {
    $nameErr = "名前は必須項目です";
  } else {
    $name = test_input($_POST["name"]);
    // 名前がアルファベットと空白のみかチェック
    if (!preg_match("/^[a-zA-Z-' ]*$/", $name)) {
      $nameErr = "アルファベットと空白のみ許可されています";
    }
  }
  
  // メールのチェック
  if (empty($_POST["email"])) {
    $emailErr = "メールアドレスは必須項目です";
  } else {
    $email = test_input($_POST["email"]);
    // メールアドレスの形式をチェック
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "不正なメール形式です";
    }
  }
  
  // URLのチェック
  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
    // URLの構文が正しいかチェック
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website)) {
      $websiteErr = "不正なURL形式です";
    }
  }
  
  // コメントの処理(任意)
  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }
  
  // 性別のチェック
  if (empty($_POST["gender"])) {
    $genderErr = "性別の選択は必須です";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

/**
 * 入力データをサニタイズする関数
 */
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

このスクリプトにより、各入力フィールドに対して適切な フォーマットチェック(Format Check)サニタイズ(Sanitization) が行われ、セキュアなフォーム処理が実現します。