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 来测试上述脚本的性能。

广告