我知道,这个问题已被提出,但不幸的是,如何解决这个问题没有答案。
这出现在我的日志文件中:
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';
答案 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)