ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHPチュートリアルのstrpos関数の文字判定に誤解があります
phpでは、strposは文字列が最初に出現する位置です。存在する場合は、trueまたは関連する特定の数値を返します。しかし、WordPressのキーワードのブラックリストを作成するために使用したいと考えています。スパム対策のコメントをいくつか見つけたので見てみましょう。
テーマのコメント-ajax.phpファイルを変更する
テーマディレクトリの comments-ajax.php ファイルでは、約 60 行目です (ユーザーが送信したコメントフォームの $_POST['author'] とその他のフィールドを取得したところです)。次に、次のコードをファイルに追加します:
コードは次のとおりです | コードをコピー |
/* |
4 追記
上記の簡単なコードにより、ユーザーのニックネームとコメントに入力されたコメント内容のブラックリスト内のキーワードの検証を実装しました。上記の単語のいずれかが一致すると、たとえば www が表示されると、ユーザーに「広告を削除する必要があります。ご了承ください。」というプロンプトが表示され、その効果は次の図に示すようになります。これはブログのもう 1 つの保険であり、スパム コメントに対する WordPress の免疫力を強化します。これもプラグインを使用しない方法で実現されます。
上記は問題ないように見えますが、今朝 @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 関数のプロトタイプを理解した後、まず簡単なテスト コードを見てみましょう。
コードをコピー | |
* @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---------- ?> |
コードは次のとおりです | コードをコピー |
/* |
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","电", "国"、"香港"、"購入"); |
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( __('広告は削除する必要があります。ご了承ください。') ); 休憩 } } |