使用strstr的switch语句总是验证为true?

时间:2015-02-06 12:26:54

标签: php switch-statement

我有以下开关声明。

该URL包含推荐ID,例如twitter,facebook或电子邮件,例如mail@mail.com。这存储为$ref

我有以下开关声明:

switch ($ref) {
    case "twitter":
        echo "twitter";
        break;
    case "facebook":
        echo "facbeook";
        break;
    case "blog":
        echo "blog";
        break;
    case strstr($ref,'@'):
        echo "email = ".$ref;
    default:
        echo "no referral found";
        break;
}

但是,如果没有传递URL(例如www.mything.co.uk),那么我希望转到default案例。

相反,我得到以下输出:

email = no referral found

为什么默认值还包括我为case strstr($ref,'@')设置的文字?

4 个答案:

答案 0 :(得分:2)

OP问题:&#34; 为什么默认值还包括我为案例strstr设置的文字($ ref,&#39; @&#39;)?&#34; < / p>

答案:输出后面没有break;,因此通过落到默认情况。

更新:解决将声明置于case范围内的问题,我还包括一个简单的解决方法:

switch ($ref) {
    case "twitter":
        echo "twitter";
        break;
    case "facebook":
        echo "facbeook";
        break;
    case "blog":
        echo "blog";
        break;
    default:
        if (strstr($ref,'@')) {
          echo "email = ".$ref;
        } else {
          echo "no referral found";
        }
        break;
}

答案 1 :(得分:1)

$ref为空字符串时,strstr($ref,'@');也返回空字符串,这就是case strstr($ref,'@'):匹配交换机输入$ref.的原因 问题是,您甚至无法使用像

这样的电子邮件验证功能
 filter_var($ref, FILTER_VALIDATE_EMAIL)

如果输入为空而不是空字符串,则返回false,但switch执行松散比较,这意味着"" == false将返回true:< / p>

http://php.net/manual/en/types.comparisons.php#types.comparisions-loose

因此,我看到的唯一解决方案是使用===运算符使用if语句:

if($ref == 'twitter') {
        echo "twitter";
} else if($ref == 'facebook') {
        echo "facbeook";
} else if($ref == 'blog') {
        echo "blog";
} else if($ref === filter_var($ref, FILTER_VALIDATE_EMAIL)) {
        echo "email = ".$ref;
} else {
        echo "no referral found";
}

答案 2 :(得分:-1)

这是因为您的测试执行方式与if ($ref == strstr($ref, '@'))类似,其中strstr返回false,等于空字符串。您无法在switch语句中真正使用动态比较。如果需要,请使用if..else。或者,滥用switch一点:

switch (true) {
    case $ref == 'twitter':
       ..
    case strstr($ref, '@'):
       ..
}

答案 3 :(得分:-1)

这将有效:

case (strstr($ref, '@') ? true : false):

但实践并不是很好。