如何检查字符串中只有一个“@”字符?

时间:2012-05-14 06:31:08

标签: php regex if-statement preg-match

  

可能重复:
  Modify regex to validate email?

$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个@符号。够容易吗?

3 个答案:

答案 0 :(得分:3)

您的第一个表达式将匹配一个@;它永远不会说它必须是唯一的一个。

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

您需要将“仅一个”或“多个”的概念转换为与regexp兼容的术语:

  • “只有一个”:一个@被非@所包围:^[^@]*@[^@]*$

  • “多个”:两个@被任何内容隔开:@.*@

和“任何但只有一个”(即0,2,3,4 ......)的相关且有用的概念仅仅是对第一个的否定(即!preg_match('/^[^@]*@[^@]*$/', $email)

答案 1 :(得分:1)

我建议使用explodecount

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

您想要实现的目标是什么?您真的想知道其中是否只有一个@,还是要验证整个电子邮件地址?如果您想验证它,请查看此帖子:Modify regex to validate email?

答案 2 :(得分: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.
?>