スパム判定の簡易バリデーション

掲示板などで見かけるスパム判定の制御について

PHP

// 文字数 $char_num = mb_strlen($target_sentence, 'UTF8'); // バイト数 $byte_num = strlen($target_sentence); // 1バイト文字が全体の9割を超えている場合 if ((($char_num * 3 - $byte_num) / 2 / $char_num * 100) > 90) { // スパム扱い }

mb_strlen('PHPをよく書いている人の備忘録', 'UTF8') で戻り値は16文字。
strlen('PHPをよく書いている人の備忘録') では42バイト。

全体に占める半角文字の割合を導き出したいので、まずは半角文字数を抽出。
16文字を全てマルチバイト文字と仮定し、マルチバイトにしたときに何バイトになるか計算。
UTF8はマルチバイトが3バイトなので、3バイトを掛ける。
16文字 * 3バイト = 48バイト扱い。

実際のバイト数と仮バイト数の差を求める。
48バイト - 42バイト = 6バイトの差となる。
42バイトの中に半角文字の1バイト分が含まれているため、3ではなく、2で差を割る。
6バイト / 2バイト = 3文字。

対象の文字列の中に半角文字が3文字含まれているのが判明。
3文字 / 16文字 * 100 = 18.75%が全体に占める半角文字の割合。

最新の記事

プロフィール

流されるままにウェブ業界で仕事しています。主にLAPP環境でPHPを書いています。最近はjQueryで遊んでいます。
※動作確認について