6

この質問が寄せられていることは知っていますが、残念ながら、この問題を解決する方法はありません。

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

PHP メッセージ: PHP 警告: strpos(): 479 行目の ... の文字列にオフセットが含まれていません

残念ながら、この問題の原因と修正方法がわかりません。この関数を何度もテストしました (大きな $text、短い $text、$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 = 'hotmail test test test test';

しかし、この文字列には「hotmail」という単語が含まれています。

$text = 'test hotmail test test test test';
4

3 に答える 3

1

2 番目の質問に答えるには、コードに 2 つの問題があります。テキスト文字列が次のとおりであると仮定します。

$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)
于 2013-04-27T11:46:17.410 に答える