2

可能重复:
修改正则表达式以验证电子邮件?

$email = $_POST["email"];

if(preg_match("[@{1}]",$email))
    echo "There is only one @ symbol";

if(preg_match("[@{2,}]",$email))
    echo "There is more than one";

我的问题很简单,但由于我很少使用正则表达式,所以输出不会按照我想要的方式出现。$email 也是发布数据。

如果 $email 有 2 个或更多 @ 符号,那么它将显示不止一个。如果 $email 有 1 个 @symbol,那么它将显示只有 1 个 @ 符号。够容易吧?

4

3 回答 3

3

您的第一个表达式将@在任何地方匹配一个;它从不说它必须是唯一的。

您的第二个表达式将匹配两个或多个连续 @符号。当您有两个被其他东西分开时,它不会检测到这种情况。

您需要将“只有一个”或“多个”的概念翻译成与正则表达式兼容的术语:

  • "only one":@被非-包围的单曲@^[^@]*@[^@]*$

  • “多于一个”:两个@被任何东西分开:@.*@

以及一个相关且有用的“除了一个之外的任何东西”(即0、2、3、4 ...)的概念,简单地作为对第一个(即!preg_match('/^[^@]*@[^@]*$/', $email))的否定

于 2012-05-14T06:39:13.657 回答
1

我建议使用explodecount这样的:

if (count(explode('@', $email)) > 2) {
    //here you have 2 or more
}

你想要达到的目标是什么?您真的想知道其中是否只有一个@,还是要验证整个电子邮件地址?如果你想验证它,看看这篇文章:修改正则表达式来验证电子邮件?

于 2012-05-14T06:42:08.433 回答
0
you need to enclose your regex in delimiters like forward slash(/) or any other char.

$email = $_POST["email"];

if(preg_match("/[@{1}]/",$email))
    echo "There is only one @ symbol"."</br>";

//you have to use preg_match_all to match all chars because preg_match will stop at first occurence of match.

if(preg_match_all("/(\w*@)/",$email,$matches)){             //\w matches all alphanumeric chars, * means 0 or more occurence of preceeding char 
    echo "There is more than one"."</br>";
    print_r($matches);}                                 //$matches will be the array of matches found.
?>
于 2012-05-14T08:10:16.800 回答