PHP - 表單郵件/URL



PHP 提供了兩種替代方法來驗證表單資料項,這些資料項是字串,但預期是電子郵件 ID 或 URL 的表示形式。檢查表單元素是否包含電子郵件/URL 的一種方法是使用正則表示式 (RegEx),另一種更方便的方法是使用 filter_var() 函式。讓我們應用這兩種方法並驗證表單提交到 PHP 指令碼的電子郵件和 URL。

本章使用的 HTML 表單如下所示:

<h1>Email and URL Validation</h1>
<form action="hello.php" method="POST">
   <p><label for="email">Enter your email:</label>
   <input type="text" id="email" name="email"></p>
   <p><label for="URL">Enter your website<label>
   <input type = "text" id="URL" name="url"></p>
   <input type="submit">
</form>

使用正則表示式進行驗證

PHP 的內建函式庫包含preg_match() 函式,該函式執行正則表示式匹配。

preg_match(
   string $pattern,
   string $subject,
   array &$matches = null,
   int $flags = 0,
   int $offset = 0
): int|false

此函式在 subject 中搜索與 pattern 中給定的正則表示式匹配的內容。preg_match() 如果模式與給定的 subject 匹配,則返回 1;如果不匹配,則返回 0;如果失敗,則返回false

有效的電子郵件 ID 應滿足以下正則表示式:

"/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix"

類似地,有效的 URL 應滿足以下正則表示式:

"/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i"

以下函式如果字串是有效的電子郵件 ID,則返回“1”或“0”。

function checkemail($str) {
   return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}

示例

讓我們使用checkmail() 函式來檢查上面 HTML 中的電子郵件欄位是否有效,方法是使用以下 PHP 程式碼:

<?php         
   function checkemail($str) {
      return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@
         ([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
   }
   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $email = $_POST['email'];
      if(!checkemail($email)){
         echo "Invalid email address.";
      } else {
         echo "Valid email address.";
      }
   }
?>

HTML 表單呈現如下所示:

PHP Form Email URl

透過在電子郵件欄位中輸入有效/無效的電子郵件字串來測試 PHP 程式碼。

以下checkURL() 函式檢查字串是否表示有效或無效的 URL,並返回“1”或“0”。

function checkURL($str) {
   return (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)
      [-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $str)) ? FALSE : TRUE;
}

示例

從 $_POST 陣列中提取的 URL 欄位作為引數傳遞給上述函式。

<?php         
   function checkURL($str) {
      return (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]
         *[-a-z0-9+&@#\/%=~_|]/i", $str)) ? FALSE : TRUE;
   }
   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $url = $_POST['url'];
      if(!checkURL($url)){
         echo "Invalid URL.";
      } else {
         echo "Valid URL.";
      }
   }
?>

您可以透過在上述表單的 URL 欄位中輸入 URL 字串來測試上述程式碼。

使用 filter_var() 函式

內建的 filter_var() 函式使用指定的過濾器過濾變數。

filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

根據$filter引數的值作為列舉的過濾器 ID,檢查$value引數,函式返回過濾後的資料,如果過濾器失敗則返回false。

有各種預定義的過濾器 ID 常量可用:

序號 ID 和描述
1

FILTER_VALIDATE_BOOL

對於“1”、“true”、“on”和“yes”返回 true。否則返回 false。

2

FILTER_VALIDATE_DOMAIN

驗證域名標籤長度是否有效。

3

FILTER_VALIDATE_EMAIL

驗證值是否為有效的電子郵件地址。

4

FILTER_VALIDATE_IP

將值驗證為 IP 地址

5

FILTER_VALIDATE_URL

將值驗證為 URL

示例

以下 PHP 指令碼驗證上述 HTML 表單提交的電子郵件和 URL 資料:

<?php
   if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $email = $_POST['email'];
      $url = $_POST['url'];

      if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
         echo "Invalid email format and please re-enter valid email\n"; 
      }
      else
      echo "Email entered is in valid format\n";

      if (!filter_var($url, FILTER_VALIDATE_URL)) {
         echo "Invalid URL format and please re-enter valid URL\n"; 
      }
      else
      echo "URL entered is in valid format\n";
   }
?>

您可以透過輸入有效/無效的電子郵件/URL 來測試上述指令碼的效能。

廣告