5

.contains()を使用して大文字と小文字を区別せずに、同じ単語のすべてのインスタンスを検索して置換しようとしていますが、機能しておらず、大文字と小文字が区別されているようです。これが私が今持っているもののコードです:

<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"));
        });

これは最初のテキストのみを変更します。同じ場合のため、ここでjsfiddleの例を見ることができます http://jsfiddle.net/ka82V/

4

4 に答える 4

2

大文字と小文字が区別されるのは、実際には「置換」です。代わりに正規表現を使用します。

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

デモ http://jsfiddle.net/ka82V/1/

于 2012-05-07T21:06:34.150 に答える
2

あなたはうまく見えます。.filter使用目的はチェーンすることなので、以下のようにしてみてください

デモ

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");
});
于 2012-05-07T21:06:55.393 に答える
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"));
});
于 2012-05-07T21:13:15.093 に答える
1

問題は元のマッチングではなく、交換方法にありました。一致した場合でも、「一部のテキスト」引数が他の大文字と小文字のバリエーションと一致しないため、置換は何もしませんでした。

:containsただし、このように jQuery のセレクターをオーバーライドするのは得策ではないと思います。関数ベースのフィルターを使用すると、コードが少なくなり、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"));
});
于 2012-05-07T21:10:29.287 に答える