jQuery를 사용하여 텍스트 문자열을 찾으십니까?


241

웹 페이지에 찾고 싶은 "단순 문자열"과 같은 문자열이 있다고 가정합니다. 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 정보를 참조하십시오.

'*'와일드 카드를 사용하여주의해야 할 점은 HTML을 포함하여 원하지 않는 body 요소를 포함한 모든 요소를 ​​얻는다는 것입니다. 그래서 jQuery와 다른 곳에서 대부분의 예제가 $ ( 'div : contains ( "I is a simple string")')


12
@Tony, 전체 단락, div 등이 아닌 일치하는 텍스트를 조작하는 방법은 무엇입니까?
Keith Donegan

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

5
예를 들어 텍스트 노드에 줄 바꿈이 있으면 작동하지 않습니다. "단순 \ n 문자열입니다." 줄 바꿈은 렌더링되지 않으므로 사용자는 문제의 위치를 ​​알 수 없습니다. 이러한 모든 솔루션에는이 문제가 있습니다.
jesper

9
-1, 작동하지 않습니다. 트리의 모든 부모 노드를 반환하며 가장 낮은 노드 만 원합니다.
TMS

51

일반적으로 jQuery 선택기는 DOM의 "텍스트 노드"내에서 검색하지 않습니다. 그러나 .contents () 함수를 사용하면 텍스트 노드가 포함되며 nodeType 속성을 사용하여 텍스트 노드 만 필터링하고 nodeValue 속성을 사용하여 텍스트 문자열을 검색 할 수 있습니다.

    $ ( '*', '본문')
        .andSelf ()
        .내용()
        .filter (함수 () {
            this.nodeType을 반환 === 3;
        })
        .filter (함수 () {
            // 텍스트의 아무 곳에 나 '단순 문자열'이 포함 된 경우에만 일치
            이것을 돌려줍니다. 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 탐색 방법 중 하나를 호출 할 때, 요소의 새로운 세트가 스택으로 푸시되는 경우를.. .andSelf ()가 도움이 될 수 있습니다. " 이전 상황이 보이지 않습니다. 무엇을 놓치고 있습니까?
Alan H.

1
공감! 대부분의 시나리오에서 일반적으로 필요하다고 생각되는 모든 부모 노드를 필터링하므로 허용되는 답변이어야합니다.
LucaM

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 ()보다 유용합니다. 실제로, 당신은 실제로 하나의 선택기에 넣을 수 있습니다 : "* : contains ( 'blah') : empty"
nickf

2
#nickf-: empty는 텍스트가 포함 된 텍스트 노드를 선택하지 않습니다. 따라서 텍스트 노드에 "단순 문자열"이 포함되어 있으면 제외됩니다. docs.jquery.com/Selectors/empty
Slim

2
나는 여기에 조금 늦었다는 것을 알고 있지만 문자열이 최상위 레벨에 존재하지만 그 안에 자식이있는 텍스트 블록을 무시하지 않습니까? 예 : <blockquote> 저는 간단한 문자열입니다 <span style = "font-weight : bold;"> 가장자리에 살기 </ span> </ blockquote>
Ken Bellows

"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는 하나의 요소 만 반환합니다.
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.