好的,我发现这很奇怪,但应该有一个解释。这是发生的事情。
这里的代码应该没有回应:
$str = 'a@gmail.com';
$key = '11111';
echo strpos($str, $key);
exit;
..是的,这正是我得到的,没有。但是!! 如果我要使用$ key(包含一个字符串)作为数组的实际键:
$str = 'a@gmail.com';
$arr = array('11111' => 'test');
foreach ($arr as $key => $val)
{
echo 'String: '.$str.'<br>';
echo 'Key: '.$key.'<br>';
echo 'Found at position: '.strpos($str, $key);
}
exit;
我得到了这个惊人的,神奇的结果:
String: a@gmail.com
Key: 11111
Found at position: 2
那么php在这里找到的字符串11111
是字母g
但更令人惊讶的是,数字会改变结果:
$str = 'a@gmail.com';
$arr = array('111' => 'test');
foreach ($arr as $key => $val)
{
echo 'String: '.$str.'<br>';
echo 'Key: '.$key.'<br>';
echo 'Found at position: '.strpos($str, $key);
}
exit;
这个给出:
String: a@gmail.com
Key: 111
Found at position: 9
有这方面的专家吗? 谢谢。
编辑: 这是我的项目中使用的实际代码示例,它给出了这样的误报:
$email = '[the email of the user here]';
$arr = array(
// [...]
'11111' => 'Banned',
'22222' => 'Banned',
'33333' => 'Banned',
// [...]
);
foreach ($arr as $key => $reason)
{
if (strpos($email, (string)$key) !== false)
{
return 'Keyword: '.(string)$key.' found in the user Email address with reason: '.(string)$reason;
}
}
所以即使在变量$key
前面使用(字符串),它也会在登录表单中禁止无辜者
答案 0 :(得分:1)
使用它,它会正常工作。我将$key
输入string
。 PHP函数strpos用于匹配字符串中的子字符串,而不是整数值。如果您查看文档,则会明确提及
第二个参数: If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
<?php
ini_set('display_errors', 1);
$str = 'a@gmail.com';
$arr = array('11111' => 'test');
foreach ($arr as $key => $val)
{
echo 'String: '.$str.'<br>';
echo 'Key: '.$key.'<br>';
echo 'Found at position: '.strpos($str, (string)$key);
}