错误:警告:strpos()[function.strpos]:字符串中未包含偏移量 - 无法找到解决方案

时间:2013-04-27 11:21:27

标签: php

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

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

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

不幸的是,我无法理解导致此问题的原因以及解决方法。我多次测试这个功能(大文本,短文本,短垃圾文字和没有垃圾邮件的话),但我从来没有得到这个错误。那么,我的用户提交哪种文本会导致此错误?

    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';

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

关于第一个问题:

最有可能的是,您将一个空字符串传递给您的函数。 Offset来电中的strpos表示应该从哪个字符开始搜索$needle。它是从0开始的,所以如果你想从绝对开始,你可以将它设置为0或省略它(它默认为0。)

关于第二个问题:

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

还有一件事:

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

答案 2 :(得分: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)