2013-04-27 4 views
5

この質問は尋ねられましたが、残念ながらこの問題の解決方法はありません。エラー:警告:strpos()[function.strpos]:オフセットが文字列に含まれていません - 解決法が見つかりません

これは私のログファイルに表示されます。

PHPメッセージ:PHPの警告を:strpos():オフセット479

残念ながらライン上で...文字列に含まれていない、私は何が原因を理解することはできませんこの問題とそれを修正する方法。私は何度もこの機能をテストしました(大きい$テキスト、短い$テキスト、$ 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); 
} 

2番目の質問:この関数は、文字列の最初の単語をフィルタリングしていないいくつかの理由

。この文字列関数は、単語 "のhotmail" を見つけられないで例えば :最初の質問に

$text = 'test hotmail test test test test'; 
+2

[ "*また、その文字列の位置は0から始まり、そしてない1注意。* "](http://us.php.net/strpos#refsect1-function.strpos-returnvalues)。開始オフセットとして '0'の代わりに' 1'を渡していて、ユーザーは空の文字列/単一文字を送信しています。 – DCoder

答えて

1

$text = 'hotmail test test test test'; 

が、この文字列で、それは単語 "のhotmail" を見つけ

ほとんどの場合、空の文字列を関数に渡しています。 strposコール内のOffsetは、どのキャラクタから$needleの検索を開始すべきかを示します。前に述べたように

:あなたは絶対最初から開始したい場合、あなたは0に設定するか(0に、それはデフォルト)、それを省略するいずれかのように、それは2番目の質問に、

0ベースですオフセットは0から始まります。したがって、$needleの最初の部分が$haystackの場合は、$offsetが1の場合は見つかりません。$offset = 1のように見えるようになりますこれは'otmail test test test test'です。

もう一つ:

私はそれは、大文字と小文字を区別しないで、それはあなたが必要な場合があります何か場合も、大文字を持つ単語を見つけるようあなたは、あなたの目的のためにstripos、ないstrposを使用する必要があります示唆しています。

+0

はい、空の文字列でした。ありがとう。 – user1406271

+0

それらのどれも私には当てはまりませんでした:( – Gediminas

1

2番目の質問に答えるには、コードに2つの問題があります。あなたのテキスト文字列と仮定すると次のとおりです。言葉「hotmailのは」だからによる位置0にありながら

$text = 'hotmail test test test test'; 

..and文はあなたがで開始している、

if (strposab($text, $spam, 1)) 

最初のものである、あなたの場合は、1をオフセット1のオフセットを指定すると、文字列に対してチェックしています。

otmail test test test test 

...そして、すべてのではない

hotmail test test test test 

第二には、「Hotmailのは」位置0であることで、あなたのstrposab()関数はブールで使用した場合に、非ブール値である、(0)int型の値を返します。 expressionはFALSEと評価されます。したがって、タイプジャグリングを避けるために!==演算子を使用する必要があります。だから、文が使用する場合は、正しいは次のようになります。

if (strposab($text, $spam, 0) !== false) 
2

オフセット値で検索する文字列の長さよりも高くなっている

関連する問題