2010-12-27 18 views
8

なぜこれが悪い考えであるかについて多くの議論がありますが、私の実装では、アカウント設定で悪い言葉を有効/無効にする予定です。言い換えれば、悪い単語はデフォルトでは表示されますが、尋ねられたらオフ/非表示になります。jQueryの言葉/悪い単語フィルタをどうすればいいですか?

JSON文字列をクライアントに送信して、クライアントが悪い言葉を除外するようにする予定です。

JSON文字列

['swear1', 'swear2'] 

オリジナルのフレーズ

this phrase includes swear1 

最終出力

this phrase includes **** 

これは私が

$(document).ready (function() { 
     $('body').html().replace('asdf', 'ffff'); 
    }); 
これまでに試したものです

私はasp.net mvcを使用していますが、サーバー側でこれを行うことができますが、これはクライアントにオフロードした方が良いと考えていました。これに。

+1

JSON文字列は 'ユニークではありませんw' ...それは、このような配列である必要があり、間違っています:' { "W":[「 "誓う"、 "swear2" ]} ' – Harmen

+3

このコードにはまだclbuttic syndromeはありますか?これはオプトインフィルタであっても望ましくない場合があります。 –

+0

できません。 「Bad word」フィルタは根本的に欠陥のあるアイデアであり、最良の実装でさえ、実際に役立つたびに誤検知でユーザーを少なくとも12回悩ます。あなたが何を思いついても、何百回もユーザーを悩ませる。参照:clbuttic。そして、どちらも、愚かな、怠惰な人でも、誰かを侮辱することを防ぐことはできません。また、クライアント側の検証も簡単に回避できます。 – delnan

答えて

2

だから私は@Harmenが与えた基本的な提案を取り上げ、それをjQueryプラグインに拡張しました。これは、私が考え出すことのできる最良の実装であるようです。

jQuery.profanityFilter

$(document).profanityFilter({ 
    replaceWith:'#', 
    customSwears: ['ass'], 
    externalSwears: '/swearWords.json' 
}) 
+0

こんにちは、どうやってアラビア語の悪い言葉を防ぐことができますか?それはprofanityFilterを使用することは可能ですか? – weblover

0

戻ったJSONオブジェクトには、属性名を繰り返し指定することはできません。 { w: 'Swear1', w: 'Swear2' }の代わりに[ 'Swear1', 'Swear2' ]にする必要があります。

特定のクラス属性を持つ<span>タグ間のすべての誓いの出現をフィルタリングしてラップし、それらを機能で切り替えることができます。それは簡単なアプローチでなければなりません。

+0

申し訳ありませんが、私はJSONにまだ慣れていませんでしたが、私は実際の置換機能についてもっと心配しています。 –

+0

あなたはJSONをもっと良くしていませんでした... – Harmen

+0

@Harmen:実際には、はい。同じ属性名を複数回使用すると、その属性に割り当てられた最後の値が返されます。 – ncuesta

1

サーバーからクライアントに移動する場合は、処理コストに対する帯域幅を常に考慮する必要があります。確かに、クライアント側で処理することで処理コストは最小限に抑えられますが、悪い言葉のリストをクライアントに移すのに多くの時間を費やすことになります。

さらに、サーバー上に置くことで、投稿を前処理することができ、ルールが変更されたときに更新するだけで、さらに処理時間を節約することができます。

+0

+1 - 私はJSONで帯域幅のコストを考えていませんでした。 –

+1

キャッシングが使用されている場合(その可能性が高い場合)、帯域幅は1回だけ使用されます。 – brildum

+0

私はこの非常に古い質問に私自身の答えを加えました。私はjQueryの冒涜フィルタを書いています。その中でJSONを一度クライアントに渡し、可能な限り、私は 'localStorage'に保存します –

12

このような何かがうまくいくかもしれない:

編集

jsFiddle

example作業
String.prototype.repeat = function(num){ 
    return new Array(num + 1).join(this); 
} 

var filter = ['ass', 'piss']; 

$('.post').text(function(i, txt){ 

    // iterate over all words 
    for(var i=0; i<filter.length; i++){ 

    // Create a regular expression and make it global 
    var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g'); 

    // Create a new string filled with '*' 
    var replacement = '*'.repeat(filter[i].length); 

    txt = txt.replace(pattern, replacement); 
    } 

    // returning txt will set the new text value for the current element 
    return txt; 
}); 

:追加の境界には、インクルードは言葉を誓う含む単語を置き換えることはありませんので。バックスラッシュを文字列でエスケープしなければならないので、二重バックスラッシュを使用しました。see this topic

+0

これはうまくいきます。 '$( '。post')。text'の代わりに' $( 'body').html'を修正しなければなりませんでした。なぜなら '.text'を使うと出力はプレーンテキストでhtmlではないからです。 –

+0

どのように正規表現フィルタ全体の単語だけを作るだろうか? IE:**ろば**はフィルタリングする必要がありますが**低音**は必要ありません。私は、 "パターン"、 "txt.replace"、オリジナルのJSON "filter"文字列に '^'と '$'を追加しようとしました。しかしそれは役に立たなかった。おそらく、それは明らかに「誓い」で始まる「身体」の始まりを探していたからだろう。 –

+0

それはあなたの境界が必要です: '\ b ... \ b'、私は私の答えを更新します;) – Harmen

-1

あなたはすべての単語を繰り返していきたいと思います:それぞれの単語について、禁止されている単語がアスタリスクに置き換えられる前にチェックしてください。

これを効率的に行うためには、あなたは、ハッシュテーブル内の単語保管することをお勧めします:各単語の上

var badWords = { 
    hello: true, 
    goodbye: true, 
}; 

反復をし、それがハッシュテーブルにあるかどうかを確認します。 (空白やアルファ以外の文字で囲まれた文字を探しているかどうかによって、「単語」を構成するものの解釈が異なります。)

// Pseudocode 
for each word in content { 
    if (badWords[word]) { 
     // replace word with word.length * characters 
    } 
} 
4

これは軽量な機能です。

var filterWords = ["fool", "dumb", "shit", "ass", "couch potato"]; 
var rgx = new RegExp(filterWords.join("|"), "gi"); 
function wordFilter(str) {   
    return str.replace(rgx, "****");    
} 
関連する問題