1

jquery コード (元のサイトは忘れました) が、html ページ内の単語を星印 (*) に置き換えるように機能していることがわかりました。 、単語の一部を変更することはできず、大文字と小文字も区別されます。

JQuery コード:

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

/* Word or Character to be replace */
var filter = ['itch','asshole', 'uck', 'sex'];
$('body').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;
});

単語フィルター:

 ['itch','asshole', 'uck', 'sex'];

そして結果:

sex -> ***    // successfully replacing
SEX -> SEX    // not replaced, i want this word also replaced to ***
bitch -> bitch // not replaced, i want this word replaced to b****

このjqueryコードを変更して、単語の一部の文字を変更し、大文字と小文字を区別しないようにする方法は?

フィドル: http://jsfiddle.net/bGhq8/

ありがとうございました。

4

3 に答える 3

1

大文字と小文字を区別するオプションを使用し、境界は必要ありません。

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

/* Word or Character to be replace */
var filter = ['itch','asshole', 'uck', 'sex'];
$('body').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(filter[i] , 'gi'); // Add the "i" modifier for case insensitivity
    // 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;
});

更新されたフィドル: http://jsfiddle.net/bGhq8/3/

于 2013-04-10T02:03:20.200 に答える
0

あなたが提供したコードの次の行:

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

単語の境界 (空白など) に一致します。filterつまり、配列内の各単語に対する単語全体の一致です。

部分的な単語として発生するかどうかに関係なく、フィルター内の単語の出現に対して一致させるには、正規表現の最初、最後、または両端から削除できます'\\b'

ただし、このアプローチは実際には理想的ではありません。正当で攻撃的でない多くの単語 ( itch「」、sextet「」など) がフィルターによって検閲されます。これは、次のいずれかがなければ簡単に解決できるものではありません。

  • 元のコードのように単語境界制約を維持する

  • 検閲したい不快な単語ごとにカスタム正規表現を書く (おそらく時間がかかりすぎる)

単一のアプローチでは誤検知が発生しないことに注意してください。

于 2013-04-10T02:04:16.007 に答える
0

あなたが言及した動作が見られる理由は、あなたが書いた正規表現のためです(以下に繰り返します):

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

手始めに、これを取得して大文字と小文字を区別しない方法で値を置き換えるには、大文字と小文字を区別しないように「i」フラグを追加する必要があります

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'gi');

さらに、単語全体のみを置換する理由は、単語境界フラグ (\b) が検索条件の周囲に配置されているためです。単語全体の置換に限定したくない場合は、置換の候補となる追加のパターンと、それらをどのように置換するかを検討する必要があります。パターンの前に 0 文字または 1 文字を許可することで、少し近づける 1 つの可能な解決策は次のようになります。

var pattern = new RegExp('\\b([A-Z]?)' + filter[i] + '\\b', 'gi');
var replacement = '$1'+'*'.repeat(filter[i].length);
txt = txt.replace(pattern, replacement);

補足として、http://regexpal.com/は、正規表現をテスト (および学習) するのに最適な場所です。

于 2013-04-10T02:11:55.143 に答える