28

为什么这个独立代码不起作用:

$link = 'https://google.com';
$unacceptables = array('https:','.doc','.pdf', '.jpg', '.jpeg', '.gif', '.bmp', '.png');

foreach ($unacceptables as $unacceptable) {
        if (strpos($link, $unacceptable) === true) {
            echo 'Unacceptable Found<br />';
        } else {
            echo 'Acceptable!<br />';
        }
}

即使 https 包含在$link变量中,它每次都可以打印。

4

5 回答 5

73

如有疑问,请阅读文档

[strpos] 返回 haystack 字符串中第一次出现 needle 的数字位置。

所以你想尝试更多类似的东西:

// ...
if (strpos($link, $unacceptable) !== false) {

因为 elsestrpos返回一个数字,而您正在寻找一个 boolean true

于 2011-02-01T04:40:15.797 回答
13

strpos()找到匹配项时不返回 true,它返回第一个匹配字符串的位置。注意,如果匹配是字符串的开头,它将返回一个零索引,除非您使用 === 运算符,否则它将比较等于 false。

于 2011-02-01T04:40:43.443 回答
6

你的失败条件是错误的。

如果未找到匹配,strpos 返回 false,因此您需要显式检查

if (strpos($link, $unacceptable) !== false) {
于 2011-02-01T04:44:05.407 回答
1

Strpos 总是返回位置,就像您在字符串中搜索“httpsL”('https://google.com';)然后它返回第 0 个位置并且 PHP 将其评估为 false。

请看这个链接:(希望它对你很有用): http: //php.net/manual/en/function.strpos.php

于 2011-02-01T04:47:40.387 回答
0

strpos

函数可能返回布尔值 FALSE,但也可能返回非布尔值,其计算结果为 FALSE。

所以我确实喜欢这个

if (strpos($link, $unacceptable) !== false) {
    //Code
}
于 2016-11-28T09:35:43.773 回答