1

ユーザーが無料の広告を投稿して広告を検索できるようにする codeigniter を使用して Web サイトを開発しています。ユーザー入力をデータベース テーブルに格納されている不快な単語のリストと照合して、ユーザーが入力した場合にすばやくチェックする方法を探しています。その表にリストされている単語の 1 つである場合は、削除する (入力しない) 必要があります。私のテーブルは MySql 全文検索機能を使用しています。

SQLでlikeを使ってみましたが、レコードが数千に達すると遅くなると言われました。

codeigniter に適切な解決策はありますか?

4

1 に答える 1

1

これを行うには多くの方法があります。あなたの状況では、SQL を使用することさえありません。すべての悪い単語の正規表現を使用して CI に構成オプションを記述し、入力をそれらの悪い単語と照合します。例えば

$config['bad_words'] = "/[\s](ass|sex|butt|badword)[\s]/i";
$input               = preg_replace($config['bad_words'],"",$input);

これは、何千ものレコードがある場合に機能しますが、何千もの不適切な単語があると少し遅くなる可能性があります。もちろん、使用したい悪い言葉がいくつかある場合、正規表現は悪い考えです。何千もの悪い言葉がある場合は、mysql で「like」を使用します。少し遅くなりますが、パフォーマンスへの影響はそれほど大きくありません。

SQL では、悪い言葉 (または悪い言葉の正規表現) のデータベースを作成します。bad_words テーブルの各行には、「fu.k」などの悪い単語に一致する正規表現が含まれます。入力を検証して不適切な単語を除外する場合は、次のことを行う必要があります。

<?php 
  $res = mysql_query( "select * from bad_words" );
  ...
  //get all rows in array $badWords
  ...
  $myRegexMatch = implode ( "|" , $badWords );
  preg_replace($myRegexMatch,"",$input);
?>

これはおそらく最速のソリューションの 1 つであり、実装が簡単で、非常に迅速です。高速化したい場合は、データベース キャッシングを使用して、データベースから取得した正規表現をキャッシュすることもできます。

さらに高速に実行することに興味がある場合 (実際には必要ありません)、「広告」が挿入されることになっている場合は常に、データベース内でこの正規表現の一致を行うデータベース トリガー/制約を記述します。

于 2012-06-23T00:36:28.863 に答える