jQueryを使用してテキスト文字列を検索しますか?


241

Webページに「I am a simple string」などの検索したい文字列があるとします。JQueryを使用してこれにどう対処しますか?

回答:


327

jQueryにはcontainsメソッドがあります。ここにあなたのためのスニペットがあります:

<script type="text/javascript">
$(function() {
    var foundin = $('*:contains("I am a simple string")');
});
</script>

上記のセレクタは、ターゲット文字列を含むすべての要素を選択します。foundinは、一致した要素を含むjQueryオブジェクトになります。https://api.jquery.com/contains-selector/の API情報を参照してください。

'*'ワイルドカードで注意すべき点の1つは、htmlやbody要素を含むすべての要素を取得することです。そのため、jQueryおよびその他の場所でのほとんどの例では、$( 'div:contains( "I am a simple string")')を使用しています。


12
@トニー、段落全体やdivなどだけでなく、一致するテキストだけを操作するにはどうすればよいですか?
キース・ドネガン、

12
これは大文字と小文字が区別されることを指摘する必要があります。「me」という名前のユーザーがjQueryのドキュメントページでこれを書きました:$ .expr [':']。icontains = function(obj、index、meta、stack){return(obj.textContent || obj.innerText || jQuery( obj).text()|| '').toLowerCase()。indexOf(meta [3] .toLowerCase())> = 0; }; 例:$( "div:icontains( 'John')")。css( "text-decoration"、 "underline");
Brandon Bloom

これはjsonで機能しますか?json値の一部のテキストをフィルタリングする場合はどうなりますか?
Chamilyan 2010

5
たとえば、テキストノードに改行がある場合、これは機能しません。「私は単純な文字列です\ n」。改行はレンダリングされないため、ユーザーはどこに問題があるのか​​さえわからないことに注意してください。これらすべてのソリューションにはこの問題があります。jsfiddle.net/qPeAxを
jesper

9
-1、機能しません。ツリー内のすべての親ノードを返します。最下位のノードのみが必要です。
TMS

51

通常、jQueryセレクターはDOMの「テキストノード」内を検索しません。ただし、.contents()関数を使用する場合、テキストノードが含まれるため、nodeTypeプロパティを使用してテキストノードのみをフィルター処理し、nodeValueプロパティを使用してテキスト文字列を検索できます。

    $( '*'、 'body')
        .andSelf()
        .contents()
        .filter(function(){
            this.nodeType === 3を返します。
        })
        .filter(function(){
            //テキストに「単純な文字列」が含まれている場合のみ一致
            これを返すthis.nodeValue.indexOf( 'simple string')!= -1;
        })
        .each(function(){
            // this.nodeValueで何かをします
        });

8
明確にするために、Tonyが述べたように、「:contains()」セレクターを使用してテキストノード内を検索できますが、jQueryは結果(個々の要素のリストのみ)の個々のテキストノードを返しません。ただし、.contents()を使用すると、jQueryは要素とテキストノードの両方を返します。詳細:docs.jquery.com/Traversing/contents
BarelyFitz

5
なんで使って.andSelf()いるのか戸惑う。api.jquery.com/andSelfから: "jQueryオブジェクトは、一致した要素セットへの変更を追跡する内部スタックを維持します。DOMトラバーサルメソッドの1つが呼び出されると、新しい要素セットがスタックにプッシュされます。以前の要素のセットも必要であり、.andSelf()が役立ちます。」以前のコンテキストが表示されません。何が欠けていますか?
アランH.

1
賛成です!ほとんどのシナリオで共通のニーズであると私が考えるすべての親ノードを除外するため、これは受け入れられる答えになるはずです。
LucaM 2016年

29

これにより、「I am a simple string」を含むリーフ要素のみが選択されます。

$('*:contains("I am a simple string")').each(function(){
     if($(this).children().length < 1) 
          $(this).css("border","solid 2px red") });

以下をアドレスバーに貼り付けてテストします。

javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;

「私は単純な文字列」だけを取得したい場合。まず、テキストを要素でラップします。

$('*:contains("I am a simple string")').each(function(){
     if($(this).children().length < 1) 
          $(this).html( 
               $(this).text().replace(
                    /"I am a simple string"/
                    ,'<span containsStringImLookingFor="true">"I am a simple string"</span>' 
               )  
           ) 
});

そしてこれを行います。

$('*[containsStringImLookingFor]').css("border","solid 2px red");

3
.filter()関数は、ここでは.each()よりも便利です。実際、実際には1つのセレクターに置くことができます: "*:contains( 'blah'):empty"
nickf

2
#nickf-:emptyは、テキストを含むテキストノードを選択しません。したがって、テキストノードに「I am a simple string」が含まれている場合は除外されます。docs.jquery.com/Selectors/empty
スリム

2
私はここで少し遅れていることを知っていますが、これは文字列がトップレベルに存在し、その中に子があるテキストブロックを無視しませんか?例:<blockquote>私は単純な文字列<span style = "font-weight:bold;"> LIVING ON THE EDGE </ span> </ blockquote>
ケンベローズ

「containsStringImLookingFor」は有効なHTML属性ではないことをお伝えしておきます。HTML 5「data-containsStringImLookingFor」に使用してください。5より前のHTMLバージョンでカスタム属性を追加する方法はありません...
Snickbrack

17

検索するテキストに最も近いノードが必要な場合は、これを使用できます。

$('*:contains("my text"):last');

これは、HTMLが次のようになっている場合でも機能します。

<p> blah blah <strong>my <em>text</em></strong></p>

上記のセレクターを使用すると、<strong>タグが見つかります。これは、その文字列全体を含む最後のタグだからです。


1
これは機能していないようです。たとえば、このページでは、*:contains( "the"):lastは1つの要素のみを返します。
bzlm

4
@bzlm:まあそれは必ずしも彼が複数の出現を見つけたかったことを指定しなかった。
nickf

2
あは。複数回発生するように機能させる方法はありますか?再帰的なノードタイプチェックなどを含むソリューションよりもエレガントなソリューションだと思います
bzlm

1
すべてのノードを取得することを考えることができる唯一の方法ですが、行の上のすべての祖先が結果をループしてすべての親を削除することになりますが、問題が発生する可能性があります。例:<p>my text <b>my text</b></p>- <b>タグの祖先を削除すると、他の試合に負ける
nickf


7

Tony Millerの答えに追加すると、90%が私が探していたものの、それでも機能しませんでした。.length > 0;彼のコードの最後に追加すると、スクリプトが機能します。

 $(function() {
    var foundin = $('*:contains("I am a simple string")').length > 0;
 });

見つかった文字列に新しい単語を追加する方法?、見つかった作品にアスタリスクを追加したい。
userAZLogicApps

@SaMolPP foundin += '*';
Pixelomo

2

この機能は動作するはずです。基本的には、リーフノードの個別のリストを取得するまで、再帰的なルックアップを実行します。

function distinctNodes(search, element) {
    var d, e, ef;
    e = [];
    ef = [];

    if (element) {
        d = $(":contains(\""+ search + "\"):not(script)", element);
    }
    else {
            d = $(":contains(\""+ search + "\"):not(script)");
    }

    if (d.length == 1) {
            e.push(d[0]);
    }
    else {
        d.each(function () {
            var i, r = distinctNodes(search, this);
            if (r.length === 0) {
                e.push(this);
            }
            else {
                for (i = 0; i < r.length; ++i) {
                    e.push(r[i]);
                }
            }
        });
    }
    $.each(e, function () {
        for (var i = 0; i < ef.length; ++i) {
            if (this === ef[i]) return;
        }
        ef.push(this);
    });
    return ef;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.