フォームで特定のドメインに一致するメールアドレスを弾く

クライアントの要望で、特定のドメインに一致するメールアドレスを除外してほしいと言われたので対応をメモ。

form

<form action="confirm.php" method="post">
  <div class="form-item">
    <div class="form-item-ttl">メールアドレス<span>必須</span><?php if ($_SESSION["err_email"]) { ?><span class="error"><?php print $_SESSION['err_email']; ?></span><?php } ?></div>
    <div class="form-item-content">
      <input type="email" id="email" name="email" value="<?php print $_SESSION['email']; ?>">
    </div>
  </div>
  <button type="submit">確認</button>
</form>

confirm.php

<?php 
//エスケープ
function strEsc($str)
{
  return htmlspecialchars($str, ENT_QUOTES, "UTF-8");
}

function form_check()
{
  $error = array();

  //排除ドメイン
  $freemails = array(
    'gmail.com',
    'yahoo.co.jp',
    'outlook.jp',
  );

  $_SESSION["email"] =  strEsc($_POST["email"]);

  if (!$_SESSION["email"]) {
    $_SESSION["err_email"] = "メールアドレスを入力をしてください";
    $error["email"] = 1;
  } else {
    if (!filter_var($_SESSION['email'], FILTER_VALIDATE_EMAIL)) {
      $_SESSION["err_email"] = "適切なメールアドレスを記載ください";
      $error["email"] = 1;
    } else {
      //ドメインのチェック
      foreach ($freemails as $freemail) {
        if (preg_match("/@" . preg_quote($freemail) . "$/ui", $_SESSION['email'])) {
          $_SESSION["err_email"] =  'こちらのドメインはお使いになれません';
          $error["email"] = 1;
          break;
        } else {
          $_SESSION["err_email"] = "";
          $error["email"] = "";
        }
      }
    }
  }
  if (array_filter($error)) {
    //エラーがあったら戻す
    print "<meta http-equiv='refresh' content='0;URL=/'>";
    exit;
  }
}
form_check();
?>

<div class="form-item">
  <div class="form-item-ttl">メールアドレス</div>
    <div class="form-item-content">
   <?php print $_SESSION['email']; ?>
  </div>
</div>