2012-05-07 18 views
5

同じ単語のすべてのインスタンスを検索して置換しようとしていますが、.contains()を使用して大文字と小文字を区別しませんが、動作していないと思われます感受性が高い。jqueryの検索と置換

<p>some text</p> 
<p>Some Text</p> 
<p>Some TEXT</p> 


jQuery.expr[':'].Contains = function(a, i, m) { 
     return jQuery(a).text().toUpperCase() 
      .indexOf(m[3].toUpperCase()) >= 0; 
     }; 
     jQuery.expr[':'].contains = function(a, i, m) { 
     return jQuery(a).text().toUpperCase() 
      .indexOf(m[3].toUpperCase()) >= 0; 
     }; 


     $('p').filter(":contains('some text')").each(function(){ 
      $(this).text($(this).text().replace("some text", "replace with new text")); 
     }); 

これが唯一の理由は、あなたがここにJSフィドル上の例で見ることができ、同じケース の、最初のテキストを変更 http://jsfiddle.net/ka82V/

答えて

1

に問題がオリジナルのマッチングとしていますが、交換されたかにはなかったですとして以下のようにしてみてください。 と一致しても、 "some text"引数が他のケースの変形と一致しないため、replaceは何もしませんでした。

しかし、このようなjQueryの:containsセレクタを上書きすることはお勧めできません。関数ベースのフィルタを使用すると、コードが少なくて済み、jQueryは変更されません。 http://jsfiddle.net/Y6bhS/1/問題の根本的な原因を指摘して

$('p').filter(function() { 
    return /some text/i.test($(this).text()); 
}).each(function(){ 
    $(this).text($(this).text().replace(/some text/i, "replace with new text")); 
}); 
+0

私はこれを好きであり、あなたに同意する、私たちはjQueryをオーバーライドすべきではない、それは悪い考えであろう。しかし、質問があります、i.testは何ですか? – Kevin

+0

'.test'はJavaScriptの' RegExp'オブジェクトのメソッドで、引数(この場合 '$(this).text()')に対して正規表現を実行し、それが一致するかどうかに基づいてtrueまたはfalseを返します。この場合の 'RegExp'オブジェクトは、実際にはリテラルです(文字列' String'オブジェクトのように 'some string/i'です)。 'i'部分は大文字小文字を区別しないように指示します。 –

+0

@ChrissPratt私は感謝を見る、私は学んだRegExpまだ、私は検索の問題を抱えていたと思いますが、交換するが、その作業、非常にありがとう – Kevin

2

それは実際には「置き換えます:ここで私は今持っているもののコードがあります大文字と小文字を区別していました代わりに正規表現を使用してください:

text().replace(/some text/i, "replace with new text"));

DEMOhttp://jsfiddle.net/ka82V/1/

+0

1:

はで働い例を参照してください。 –

+0

@KyleMacey +1カイルありがとう!私は数字を出すことができませんでした – Kevin

2

あなたは正常に見えるが含まれています。 .filterを使用する目的は、チェーン

DEMO

jQuery.expr[':'].containsCI = function(a, i, m) { 
    return jQuery(a) 
     .text() 
     .toUpperCase() 
     .indexOf(m[3].toUpperCase()) >= 0; 
}; 

$('p').filter(":containsCI('some text')").text(function() { 
    return $(this).text().replace(/some text/i, "replace with new text"); 
}); 
+0

OPが要素のすべてのテキストを置き換えたくない場合はどうなりますか? –

+0

@KyleMacey彼は戻りの中に同じ置換コードを書くことができます。それが彼の元の投稿にあった方法で更新されました。 –

1
jQuery.expr[':'].Contains = function(a, i, m) { 
    return new RegExp(m[3], 'ig').test(jQuery(a).text()); // case insensitive replace 
}; 
jQuery.expr[':'].contains = function(a, i, m) { 
    return new RegExp(m[3], 'ig').test(jQuery(a).text()); // case insensitive replace 
}; 

$('p').filter(":contains('some text')").each(function() { 
    $(this).text($(this).text().replace(new RegExp($(this).text(), 'i'),"replace with new text")); 
});