PHP 中不可靠的布尔比较:了解 strpos() 的怪癖
在 PHP 中,strpos() 函数是一个基本工具在字符串内搜索。然而,程序员遇到的一个常见陷阱是将使用严格相等运算符 (===) 的 strpos() 的结果与 true 进行比较。
问题:
考虑以下代码片段:
$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 />'; } }
此代码尝试检查 $link URL 是否包含中列出的任何字符串$不可接受的。然而,它意外地打印出“可接受!”对于所有情况,即使 $link 中存在“https:”。
解决方案:
问题的根源在于 PHP 比较结果的行为strpos() 的。默认情况下,strpos() 返回一个整数,表示子字符串在字符串中第一次出现的位置。如果未找到子字符串,则返回 false。
在代码片段中,将 strpos() 与 true 进行比较时,实际上是在检查结果是否为非零数字。由于该函数在找到匹配项时始终返回一个数字,因此此比较始终返回 true,从而错误地指示子字符串的存在。
要解决此问题,请改用严格不等运算符 (!==),该运算符检查不相等性。这可确保在未找到子字符串时进行与 false 的比较。
// ... if (strpos($link, $unacceptable) !== false) {
通过执行此简单修改,当 $link URL 包含一个时,代码片段将正确识别并打印“Unacceptable Found”禁止的子字符串。
以上是为什么 PHP 中的'strpos()”严格相等常常会产生意想不到的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!