ホームページ  >  記事  >  バックエンド開発  >  PHP_PHPチュートリアルのstrpos関数の文字判定に誤解があります

PHP_PHPチュートリアルのstrpos関数の文字判定に誤解があります

WBOY
WBOYオリジナル
2016-07-13 10:45:051612ブラウズ

phpでは、strposは文字列が最初に出現する位置です。存在する場合は、trueまたは関連する特定の数値を返します。しかし、WordPressのキーワードのブラックリストを作成するために使用したいと考えています。スパム対策のコメントをいくつか見つけたので見てみましょう。

テーマのコメント-ajax.phpファイルを変更する

テーマディレクトリの comments-ajax.php ファイルでは、約 60 行目です (ユーザーが送信したコメントフォームの $_POST['author'] とその他のフィールドを取得したところです)。次に、次のコードをファイルに追加します:

コードは次のとおりです コードをコピー

/*
* @Author: vfhky 2013年9月21日 22:13
* @変数文字列 $word: ブラックリスト内のキーワード。ユーザーはルールに従ってキーワードを増減できます
* @変数文字列 $comment_author: ユーザーによって送信された $_POST['author'] フィールドの値。ニックネームを示します
* @変数文字列 $comment_content: ユーザーによって送信された $_POST['comment'] フィールドの値。コメントの内容を示します
**/
$words = "com、cn、情報、ネット、www、http、cc、ホスト、エージェント、モバイル、電気、国、香港、設備、サービス、薬、肥料、医学、農業、クレジット、ローン、日、利益、ネット、チケット、ドメイン、販売、夫、会社、企業、マシン、家賃、人、お金、セット、購入、放送";
$word =explode(',', $words);
$num = count($word);
for($i=0;$i If (strpos($comment_author,$word[$i],0) || strpos($comment_content,$word[$i],0)){
err( __('広告は削除する必要があります。ご了承ください。') );
休憩
}
}

4 追記

上記の簡単なコードにより、ユーザーのニックネームとコメントに入力されたコメント内容のブラックリスト内のキーワードの検証を実装しました。上記の単語のいずれかが一致すると、たとえば www が表示されると、ユーザーに「広告を削除する必要があります。ご了承ください。」というプロンプトが表示され、その効果は次の図に示すようになります。これはブログのもう 1 つの保険であり、スパム コメントに対する WordPress の免疫力を強化します。これもプラグインを使用しない方法で実現されます。

PHP_PHPチュートリアルのstrpos関数の文字判定に誤解があります上記は問題ないように見えますが、今朝 @bad Children's Shoes が悪質なテストを実行し、前の記事のコードにバグを発見しました。夕方仕事から帰ってきてコードをよく見てみたら、strpos関数の理解が一方的だったのでメモしておきました。

2 strpos関数のプロトタイプ

strpos 関数は皆さんよくご存知だと思いますが、文字列処理でよく見られます。 strpos 関数のプロトタイプは次のとおりです:

/*
* @Para string $source: この文字列 [*] で検索します
* @Paramixed $target: 検索する文字列。文字列でない場合は、整数に変換され、文字 [*]
の連続値とみなされます。 * @Para int $offset: 検索の開始位置
* @Return int/boolean: 成功した場合は最初の出現位置を返し、失敗した場合は FALSE 値を返します。 **/
int strpos(string $source,mixed $target [, int $offset = 0 ]);

3 strpos関数の簡単なテスト

strpos 関数のプロトタイプを理解した後、まず簡単なテスト コードを見てみましょう。

コードは次のとおりですコードをコピー /*

テスト結果は以下の図に示されています:

PHP_PHPチュートリアルのstrpos関数の文字判定に誤解があります

WordPress のスパム対策コメントについて再議論: それはすべて strpos 関数のせいです


4 strpos関数のテスト結果分析

上記のコードには 2 つの異なるテスト変数 $test_1 と $test_2 があり、どちらにもブラックリストのキーワード「purchase」が含まれています。ただし、図に示されているテスト結果から判断すると、$test_1 変数は効果的にブロックされていませんが、変数 $test_2 には広告ワードを含めるように促されています。その秘密は、変数 $test_1 と $test_2 の「購入」という単語の出現位置にあります。キーワード「購入」が先頭($test_1)にある場合、文字列「購入」の中に「購入」という単語が含まれているため、strpos($test_1,$word[$i],0) 関数の実行結果は 0 になります。 TT「フロントです。そうすると、for ループ内の if 文が if(0){} となり、スパムコメントとみなされなくなり BUG が発生します。 「wordpress キーワード ブラックリスト: スパム コメント対策アップグレード」を実装するには、引き続き strpos 関数を使用する方法と、PHP 正規表現を使用する 2 つの方法があります。
5.1 strpos 関数を正しく使用してバグを修正する

* @Author: vfhky 2013年9月21日 20:35
* @Description: 2 つの異なるテスト変数 $test_1 と $test_2 を通じてキーポイントをヒットします
**/
$words = "com,cn,info,net,www,http,cc,host,agent,mobile,electric,country,香港,日本,ショッピング";
$word =explode(',', $words);
$num = count($word);
$test_1 = "TT を購入";
for($i=0;$i If (strpos($test_1,$word[$i],0)){
echo '広告は削除する必要があります。ご了承ください。';
休憩
}
}
echo "

----------これは $test_1 END----------


$test_2 = "TT を買うのは間違っています";
for($i=0;$i If (strpos($test_2,$word[$i],0)){
echo '広告は削除する必要があります。ご了承ください。';
休憩
}
}
echo "

----------これは $test_2 END----------

?>
コードは次のとおりです コードをコピー

/*
* @Author: vfhky 2013年9月24日 20:06
* @Description: strpos 関数を正しく使用して、前の記事のコードのバグを解決してください

**/
$words = "com、cn、情報、ネット、www、http、cc、ホスト、エージェント、モバイル、電気、国、香港、設備、サービス、薬、肥料、医薬品、農業、クレジット、ローン、日本、購入、ブロードキャスト」;
$word =explode(',', $words);
$num = count($word);
for($i=0;$i If ( (strpos($comment_author,$word[$i],0) !== false) || (strpos($comment_content,$word[$i],0) !== false) ){
err( __('広告は削除する必要があります。ご了承ください。') );
休憩
}
}

5.2 PHP 正規表現を使用してバグを修正する

コードは次のとおりです コードをコピー
/*
* @Author: vfhky 2013年9月24日 20:06
* @Description: PHP 正規表現を使用してバグを修正し、「WordPress キーワード ブラックリスト: スパムコメント対策アップグレード (非プラグイン)」を実装します

**/
$words = "com,cn,info,net,www,http,cc,host,agent,mobile,electricity,country,香港,機器,サービス,医薬品,肥料,医薬品,農業,クレジット,ローン,日本,購入、ブロードキャスト」;
$word =explode(',', $words);
$num = count($word);
for($i=0;$i If( preg_match("/$word[$i]/i", $comment_author) || preg_match("/$word[$i]/i", $comment_content) ){
err( __('広告は削除する必要があります。ご了承ください。') );
休憩
}
}

6 関数 strpos に関する重要な注意事項

strpos 関数を使用するときに注意すべきもう 1 つの点は、この関数はブール値 FALSE を返す可能性がありますが、FALSE に相当する非ブール値も返す可能性があることです。
たとえば、整数型 0、浮動小数点値 0.0、空の文字列、文字列 "0"、要素を含まない配列、メンバー変数を含まないオブジェクト、特殊な型 NULL などを返します。
したがって、この関数の戻り値は、単純な等号「==」を使用するのではなく、戻り値の型をチェックする恒等演算子「===」を使用してテストする必要があります。

7更新2013.09.26 22:27

@星河大帝からの注意を受けて、文字列の代わりに配列を使用しても、実行効率はほぼ同じになるはずです。
7.1 strpos 関数 + 配列を使用してバグを修正する

コードは次のとおりです コードをコピー

$words = array("com","cn","info","net","www","http","cc","host","agent","mobile","电", "国"、"香港"、"購入");
$num = count($words);
for($i=0;$i If (strpos($comment_author,$words[$i],0) !== false || strpos($comment_content,$words[$i],0) !== false){
err( __('広告は削除する必要があります。ご了承ください。') );
休憩
}
}

7.2 正規表現と配列を使用してバグを修正します

コードは次のとおりです コードをコピー
$words = array("com","cn","info","net","www","http","cc","host","agent","mobile","电", "国"、"香港"、"購入");
$num = count($words);
for($i=0;$i If( preg_match("/$words[$i]/i", $comment_author) || preg_match("/$words[$i]/i", $comment_content) ){
err( __('広告は削除する必要があります。ご了承ください。') );
休憩
}
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/633054.html技術記事 phpでは、strposは文字列が最初に出現する位置です。存在する場合はtrueまたは関連する特定の数値を返します。しかし、これを使用してwordpressのキーワードをblacknameにしたいのです。 .
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。