【问题标题】:Why FILTER_SANITIZE_EMAIL is not removing invalid characters from invalid email address?为什么 FILTER_SANITIZE_EMAIL 没有从无效的电子邮件地址中删除无效字符?
【发布时间】:2026-01-12 12:20:03
【问题描述】:

我正在从 w3schools PHP 教程学习 PHP。

在关于 PHP 过滤器的一章中,我遇到了以下程序:

<!DOCTYPE html>
    <html>
      <body>

      <?php
        $email = "john.doe@example.com";

        // Remove all illegal characters from email
        $email = filter_var($email, FILTER_SANITIZE_EMAIL);

        // Validate e-mail
        if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
          echo("$email is a valid email address");
        } else {
          echo("$email is not a valid email address");
        }
      ?>

  </body>
</html>

w3schools 是说 filter_var() 函数用于首先从 $email 变量中删除所有非法字符,然后检查它是否是有效的电子邮件地址。

然后我尝试将变量 $email 的值设置为 "john.doe@exampleW#%%%%%.com" 并尝试按如下方式打印该值:

<!DOCTYPE html>
<html>
   <body>

   <?php
     $email = "john.doe@exampleW#%%%%%.com";

     // Remove all illegal characters from email
     $email = filter_var($email, FILTER_SANITIZE_EMAIL);
     echo "Echoed Email : ".$email; die;
   ?>

   </body>
 </html>

我得到的上述程序的输出是我输入的字符串 "john.doe@exampleW#%%%%%.com"

我的问题是为什么根据 w3schools 没有删除给定无效电子邮件中的无效字符?

【问题讨论】:

  • 人们还在使用 w3fools.com?

标签: php email filter email-validation


【解决方案1】:

FILTER_SANITIZE_EMAIL 不会删除 % 字符。来自manual

删除除字母、数字和!#$%&'*+-=?^_`{|}~@.[]之外的所有字符。

电子邮件地址中有很多字符实际上是合法的。

【讨论】:

  • 我在哪里可以获得那些被视为非法字符并被 FILTER_SANITIZE_EMAIL 删除的字符列表?
  • @PHPFan 可能除了上面提到的字符之外的任何其他字符,都被认为是非法的,并且没有必要有一个列表。例如,非法字符是:¿→☺█ 和其他一些不常见/编程语言字符。
【解决方案2】:

因为在您的示例中电子邮件是有效的,

FILTER_SANITIZE_EMAIL”将允许“!#$%&'*+-=?^_`{|}~@.[]

检查exceptions

【讨论】: