6

我知道,这个问题已经被问过了,但不幸的是,没有答案如何解决这个问题。

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

PHP 消息:PHP 警告:strpos():第 479 行的字符串中不包含偏移量

不幸的是,我不明白是什么导致了这个问题以及如何解决它。我多次测试了这个函数(用大的 $text,用短的 $text,用 $spam 词和没有 $spam 词),但我从来没有得到这个错误。那么,我的用户提交的哪些文本会导致此错误?

    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”:

$text = 'hotmail test test test test';

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

$text = 'test hotmail test test test test';
4

3 回答 3

4

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

于 2016-06-11T09:29:15.537 回答
3

对于第一个问题:

很可能在某一时刻您将一个空字符串传递给您的函数。Offsetstrpos调用中指示它应该从哪个字符开始搜索$needle. 它是从 0 开始的,所以如果你想从绝对开始,你要么将其设置为 0,要么将其省略(默认为 0。)

对于第二个问题:

如前所述,偏移量是从 0 开始的,因此如果$needle您要搜索的正好在 的开头,如果是 1 $haystack,则无法找到它。这样就好像您正在搜索一个看起来像这样的字符串: .$offset$offset = 1'otmail test test test test'

还有一件事:

我建议您应该使用stripos,而不是strpos出于您的目的,因为它不区分大小写,并且如果您可能需要它,它还会找到带有大写字母的单词。

于 2013-04-27T11:34:23.160 回答
1

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

$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)
于 2013-04-27T11:46:17.410 回答