2013-03-18 4 views
2

나는 더 이상 생각할 수없는 지점을 발견했습니다. 간단히 말해서 ul의 값이 li이고 각 값이 텍스트로 수십 단어 인 li입니다. 목록의 맨 위에는 사용자가 입력 할 수있는 입력 상자가 있습니다. 예를 들어, 같은 줄에 다음 세 단어가있는 행만 필터링하면됩니다. "red sweet strawberries". 검색 버튼을 누르면되고, 선이 필터링됩니다 거기 나는에 관심이 단어를 포함하는 두 개의 행이단일 쿼리에서 여러 하위 문자열을 검색하는 방법

LI1을 :. "나는 거의 어떤 빨간색 달콤한 딸기을 먹고 기다릴"

LI2 : "여름이고 빨간 달콤한 딸기은 이제 신선한입니다"

이 시점까지는 모든 것이 좋습니다.

세 단어를 찾은 단어가 문자열을 따라 다른 단어 나 문자로 구분되는 경우 문제가 발생합니다.

LI3 : " 시장에있는 빨간색달콤한 딸기는 지금"

그래서, 여기에 내가 누워 그래서, 위 예를 촬영, 필터는 나에게 다음 줄을 표시하지 않을 것

$(document).ready(function() { 
     var links = new Array(); 
     $("h4").each(function(index, element) { 
     links.push({ 
      text: $(this).text(), 
      element: element 
     }); 
    }); 

    $("#searchbutton").click(function() { 
     var query = $("#inputtext").val(); 
     var querywords = query.split(','); 

     var results = new Array(); 
     for(var i = 0; i < querywords.length; i++) { 
      for(var j = 0; j < links.length; j++) { 
       if (links[j].text.toLowerCase().indexOf(querywords[i].toLowerCase()) > -1) { 
        results.push(links[j].element);      
        } 
      } 
     } 

     $("h4").each(function(index, element) { 
      this.style.display = 'none'; 
     }); 
     for(var i = 0; i < results.length; i++) { 
      results[i].style.display = 'block'; 
     } 

    });  

}); 

이 서브 스트링은 문자 또는 다른 단어 구분되어 있더라도, 복수의 서브 문자열 검색 결과를 얻을 수이다 상부 예에서 결과를 소트 필터 전체 기능? 내가 상황을 제대로 이해한다면

+0

첫 번째 for-loop에서'querytext'가'querywords'가 아니어야합니까? – MikeM

+0

예, 검색어. 나는 갱신했다! 이 포럼에서 저는 모든 "querytext"를 "querywords"로 변경했습니다 (예제에서 단어의 역할을 강조하기 위해). 나는 그 것을 생략했습니다. 감사. 아직도 이것이 원인이 아닙니다. – Auto4x4Motor

+0

MikeM. 내 함수에 맞게 코드를 시도했지만 불행히도 RegEx 구문에 대한 잘못된 이해로 인해 제대로 작동하지 못했습니다. 지금 저는이 RegEx에 관한 모든 것을 배우고 있습니다.귀하의 코드에 다시 한 번 감사드립니다. – Auto4x4Motor

답변

5

다음은 내가 원하는 것이라고 생각하는 한 가지 방법입니다. 예를 들어

var results = new Array(); 
for (var i = 0; i < querywords.length; i++) { 
    var regex = new RegExp( 
     '(?=.*\\b' + querywords[i].split(' ').join('\\b)(?=.*\\b') + '\\b)', 'i' 
    ); 
    for (var j = 0; j < links.length; j++) { 
     if (regex.test(links[j].text)) { 
      results.push(links[j].element); 
     } 
    } 
} 

, querywords 사용되는 항목 "red sweet strawberries",

/(?=.*\bred\b)(?=.*\bsweet\b)(?=.*\bstrawberries\b)/i 

세 긍정적 look-aheads 것 생성 regex 포함 된 경우 동일 선상에있는 세 개의 단어를 포함하는 문자열 (테스트를 통과하도록 단어 경계로 둘러싸인 경우).

데모 : JSFIDDLE.

+0

정말 멋진 작품입니다, MikeM! 귀하의 솔루션은 Google 검색과 관련하여이 문제에 대한 최고의 검색어입니다. 이제 indexOf는 광범위한 검색 기능에 대해 매우 제한적입니다. 노력해 주셔서 대단히 감사합니다 ... 안부! – Auto4x4Motor

+0

이 스레드를 어떻게 해결합니까? – Auto4x4Motor

0

, 전체 문제는 다음 예제 쿼리에서

var querywords = query.split(','); 

가 더 쉼표가 없습니다. 그래서 나는 이것이 실수라고 생각하니? 검색어를 공백으로 분할하십시오.

var querywords = query.split(' '); 
+0

공백으로 나눈다면 그 결과는 "red", "sweet"와 같은 줄 등을 줄 것입니다. – Auto4x4Motor

+0

나는 두 개 또는 세 단어 표현을 함께 찾고 쪼개지 않기를 기대하면서 어쨌든 아무 것도 나누지 않는 사용자를 찾고 있습니다. – Auto4x4Motor

+0

하지만 쉼표로 분리하는 이유는 무엇입니까? 그것은 말이되지 않습니다. 쿼리를 공백으로 분할하면됩니다. 각 행에서 얼마나 많은 검색어가 발견되었는지 간단히 테스트 할 수 있습니다. 모든 검색어가있는 행만 추가하십시오. 또는 발견 된 검색어의 수로 줄을 정렬 할 수 있습니다. 검색어를 가까이에 두시겠습니까? indexOf의 리턴 값의 차이가 너무 크지 않은지 확인하십시오. 정규식이 문제를 해결할 수도 있습니다. – vetvicka

관련 문제