2013-04-27 81 views
5

我知道,这个问题已被问到,但不幸的是,没有答案如何解决这个问题。错误:警告:strpos()[function.strpos]:偏移不包含在字符串中 - 找不到解决方案

这出现在我的日志文件:

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

[“*还要注意的是字符串位置从0开始,而不是1 。*“](http://us.php.net/strpos#refsect1-function.strpos-returnvalues)。您将'1'而不是'0'作为起始偏移量,并且您的用户正在提交空字符串/单个字符。 – DCoder 2013-04-27 11:34:21

回答

1

关于第一个问题:

最有可能在一个点上,你传递一个空字符串到你的函数。调用strpos中的Offset表示应从哪个字符开始搜索$needle。它是基于0的,所以如果你想从绝对从头开始,你要么将其设置为0或省略它(默认为0)

对第二个问题:

如前所述,偏移量是基于0的,所以如果您要搜索的$needle正好在$haystack的开头,那么如果$offset为1,则不能找到它。使用$offset = 1就好像您正在搜索的字符串看起来像这个:'otmail test test test test'

一两件事:

我建议你应该使用stripos,不strpos你的目的,因为它是不区分大小写的,也将查找单词用大写字母,如果它的东西,你可能需要。

+0

是的,这是一个空字符串。谢谢。 – user1406271 2013-04-27 13:36:54

+0

他们都不是真的对我:( – Gediminas 2014-05-22 06:31:26

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) 
2

的偏移值大于字符串的长度更高的搜索

相关问题