禁止ワード対策の設定
掲示板などで見かける禁止ワード対策方法について
PHP
// 小文字化
$str = mb_strtolower($str, ’UTF-8’);
// 半角英数字全角カタカナへ置換
$str = mb_convert_kana($str, ’KVas’, ’UTF-8’);
// スペース、句読点などを削除
$target_sentence = preg_replace(’/\s|、|。/’, ’’, $str);
// 禁止キーワードを包括する許可キーワード
$ok_words = array('●○○○●', '△△△▲▲');
// 例えば、禁止:いぬ 許可:いぬく、禁止:ねこ 許可:ねこむ
foreach ($ok_words as $okWordsVal) {
// 対象文字列にキーワードが含まれるか
if (mb_strpos($target_sentence, $okWordsVal) !== FALSE) {
// 合致したら * に変換(禁止キーワードの検索にマッチさせないため)
$target_sentence = str_replace($okWordsVal, '*', $target_sentence);
}
}
// 禁止キーワード
$ng_words = array('○○○', '△△△', '×××');
foreach ($ng_words as $ngWordsVal) {
// 対象文字列にキーワードが含まれるか
if (mb_strpos($target_sentence, $ngWordsVal) !== FALSE) {
// 含まれている場合は処理を停止...
break;
}
}
// 縦読み対策
// 1文字に分割
$lines = explode("\n", $str);
if (! empty($lines)) {
if (count($lines) > 1) {
foreach($lines as $linesKey => $linesVal) {
$onechar[$linesKey] = preg_split('//u', $linesVal, -1, PREG_SPLIT_NO_EMPTY);
}
}
}
// 縦列を結合し、単語にする
if (! empty($onechar)) {
foreach($onechar as $onecharVal) {
foreach($onecharVal as $positionKey => $positionVal) {
$rows[$positionKey] = $rows[$positionKey] . $positionVal;
}
}
}
// 単語を結合し、1行にする
if (! empty($rows)) {
foreach($rows as $rowsVal) {
// 3文字以下は対象外
if (mb_strlen($rowsVal) <= 3) {
continue;
}
$target_tateyomi = $target_tateyomi . '/' . $rowsVal;
}
// 全体でなく、1行目 $rows[0] や 2行目 $rows[1] だけの場合
// $target_tateyomi = $rows[0] . '/' . $rows[1];
}
if (! empty($target_tateyomi)) {
// 通常文と同じように禁止キーワードチェック
foreach ($ng_words as $ngWordsVal) {
// 対象文字列にキーワードが含まれるか
if (mb_strpos($target_tateyomi, $ngWordsVal) !== FALSE) {
// 含まれている場合は処理を停止...
break;
}
}
}
対象の文章からスペース、句読点などを削除すると、○○ ○と単語内にスペースが入っているもの、○○、○ や ○。○○と途中句読点が入っているものにもマッチ。
必要に応じて、記号も同様に削除するのも有り。
禁止ワードをDBではなく、ファイルに定義するのであれば設定ファイルに保持しておくのが管理しやすい。
INI
[NG_WORDS]
1 = "○○○"
2 = "△△△"
3 = "×××"
PHP
// INIファイルをパース
$code = parse_ini_file('code.ini', true);
$ng_words = $code['NG_WORDS'];