1

これはおそらくv.easyですが、私のphpは非常に錆びています。私は悪い単語フィルターを実装する必要があります...私は現在これを持っています:

if(!in_array($_POST['Name'],$profanities)) { echo $row['Name']; }

...そして悪い言葉が含まれている冒とく的な表現。問題は、ユーザーが入力した名前の一部にこれらの不適切な単語の1つが含まれているかどうかを確認できるようにしたいことです。現在取得しているのは、名前が正確に不適切な単語であるかどうかだけです。私はこれをしますか?

ありがとう

4

3 に答える 3

2

技術的にはいくつかのオプションがあり、他のいくつかの回答がこれらを指摘しています。ただし、現実的には、これを行うべきではないと思います。

冒涜フィルターは、通常とは異なる名前や住所などを持つユーザーにとって、苛立たしく制限的なものであることで知られています。

参照してください: http://en.wikipedia.org/wiki/Swear_filter#Unintended_consequences

さらに、ユーザーがフィルターを回避する方法を見つけたい場合は、そうするでしょう。置換と追加の両方として、似たような発音の文字または特殊文字を使用します。

編集: 既にこの問題に対処している優れたスタックオーバーフローの質問があります。適切な冒涜フィルターを実装するにはどうすればよいですか?を参照してください。

EDIT:上記のstackoverflowの質問は、これに関するJeffの投稿を参照していますが、繰り返して強化しても害はありません。わいせつフィルター: 悪い考えか、信じられないほど性交する悪い考えか?

于 2011-03-10T13:47:35.787 に答える
1
$name = $_POST['Name'];

foreach($profanities as $profanity) {

   if (preg_match('/\w' . preg_quote($profanity, '/') . '\w/i', $name) {
      // Bad word on its own
   }

}

これは、それ自体でのみ悪い単語に一致します...つまり、 に一致しますが、 には一致badIs it bad?ませんbaddy。それに一致させたい場合は、単語の境界を削除するか、おそらくstrstr().

ただし、単純な文字列の一致を確認することにした場合、有効な名前に不適切と見なされる部分文字列が含まれる場合があります。

出身地にちなんだユーザー名を付けたい場合はどうすればよいですか?

于 2011-03-10T13:44:20.917 に答える
1

このコードは、大文字と小文字を区別しない一致を検索して見つかったすべての不適切な単語に一致します。

foreach($profanities as $profanity)
{
    if(preg_match('/' . $profanity . '/i', $row['Name']))
    {
        echo 'Bad word found!';
    }
}
于 2011-03-10T13:45:27.140 に答える