Php 错误:警告:strps()[function.strps]:偏移量不包含在字符串中-找不到解决方案

Php 错误:警告:strps()[function.strps]:偏移量不包含在字符串中-找不到解决方案,php,Php,我知道,有人问过这个问题,但不幸的是,没有解决这个问题的答案 这将出现在我的日志文件中: PHP消息:PHP警告:strpos():偏移量不包含在。。。在线479 不幸的是,我无法理解是什么导致了这个问题,以及如何解决它。我多次测试过这个函数(使用大$text,使用短$text,使用$spam words和不使用$spam words),但我从未遇到过这个错误。那么,我的用户提交的哪些文本会导致此错误 if (strposab($text, $spam, 1)) { echo "

我知道,有人问过这个问题,但不幸的是,没有解决这个问题的答案

这将出现在我的日志文件中:

PHP消息:PHP警告:strpos():偏移量不包含在。。。在线479

不幸的是,我无法理解是什么导致了这个问题,以及如何解决它。我多次测试过这个函数(使用大$text,使用短$text,使用$spam words和不使用$spam words),但我从未遇到过这个错误。那么,我的用户提交的哪些文本会导致此错误

    if (strposab($text, $spam, 1)) {
    echo "Email addresses and URLs not allowed here";
die;
    }

$spam = array('http','www','hotmail','yahoo','gmail','msn');


function strposab($haystack, $needles=array(), $offset=0) {
$chr = array();
foreach($needles as $needle) {
$res = strpos($haystack, $needle, $offset);
if ($res !== false) $chr[$needle] = $res;
}
if(empty($chr)) return false;
return min($chr);
} 
第二个问题:

由于某些原因,此函数不过滤字符串的第一个字。 例如,在此字符串函数中找不到单词“hotmail”:

但在这个字符串中,它找到了单词“hotmail”:


对第一个问题:

很可能在某一时刻您正在向函数传递一个空字符串<
strpos
调用中的code>Offset指示应从哪个字符开始搜索
$pinder
。它是基于0的,因此如果要从绝对开始,可以将其设置为0或忽略(默认为0)

第二个问题:

如前所述,偏移量是以0为基础的,因此如果要搜索的
$needle
恰好位于
$haystack
的开头,那么如果
$offset
为1,则无法找到它。使用
$offset=1
时,就好像您正在搜索一个如下所示的字符串:
'otmail test'

还有一件事:


我建议您应该使用
stripos
,而不是
strpos
,因为它不区分大小写,如果您需要的话,还可以找到大写字母。

回答第二个问题-您的代码中有两个问题。假设您的文本字符串为:

$text = 'hotmail test test test test';
…你的if语句是

if (strposab($text, $spam, 1))
首先,您从偏移量1开始,而单词“hotmail”位于位置0。因此,通过指定偏移量1,可以检查字符串:

otmail test test test test
…而不是

hotmail test test test test
其次,当“hotmail”位于位置0时,strposab()函数将返回int(0)值,这是一个非布尔值,在布尔表达式中使用时,其计算结果为FALSE。因此,您需要使用!==操作员,以避免类型杂耍。因此,要使用的正确if语句是:

if (strposab($text, $spam, 0) !== false)

偏移量值大于要搜索的字符串长度。

。您正在传递
1
而不是
0
作为起始偏移量,并且您的用户正在提交一个空字符串/单个字符。是的,它是一个空字符串。谢谢
hotmail test test test test
if (strposab($text, $spam, 0) !== false)