2013-04-27 45 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

的偏移值大於字符串的長度更高的搜索

相關問題