为什么 strpos() 与 True 的严格比较会产生意外结果?
问题:
在给定的代码中,目的是找到里面任何不可接受的字符串$link 变量。但是,即使 $link 中存在“https”,代码也会打印“Acceptable”。这种意外行为背后的原因是什么?
$link = 'https://google.com'; $unacceptables = ['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 />'; } }
答案:
解释在于 strpos() 函数的本质。如文档所述,strpos() 返回 $link 中 $unacceptable 第一次出现的数字位置。但是,在原始代码中,它与具有布尔值的 true 进行了错误的比较。这会导致意外结果。
要解决此问题,应修改比较以检查非 false 值。通过使用 !== false,代码将正确识别任何发现的不可接受的字符串。
// ... if (strpos($link, $unacceptable) !== false) {
以上是为什么在检查字符串时 `strpos() === true` 会给出意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!