2013-09-02 7 views
1

검색 결과 강조 표시 : 나는 아래 코드를 사용하여 코퍼스/텍스트의 단어를 검색하고 있습니다. 코드는 PHPFiddle에 있습니다. 완전한 단어 만 일치합니다 (대소 문자를 구분하지 않음). 모든 단어를 찾으면 일치하는 단어가 HTML 앵커 a 태그로 묶여 있습니다. 따라서 궁극적으로 함수를 호출 한 후 코퍼스를 에코하여 검색 결과가 강조된 코퍼스를 가져올 수 있습니다 (사용하는 CSS에 따라 다름).PHP에서 일치하는 내용 검색하기

function highlight($corpus, $words) { 
    preg_match_all("~\w+~", $words, $m); 
    if(!$m) return $corpus; 
    $re = "~\\b(" . implode("|", $m[0]) . ")\\b~i"; 
    return preg_replace($re, "<a href='#'>$0</a>", $corpus); 
} 

$corpus = "Hello, world! Today is an amazing day!"; 
echo highlight($corpus, 'hello'); 

검색 결과 탐색는 : 코퍼스가 큰 경우, 단독으로 강조하는 것은 쉽게 사용자가 일치 통과 할 수 있도록하지 않습니다. 사용자는 예를 들어 다음/이전 버튼을 통해 순서대로 각 일치 항목을 탐색 할 수 있습니다. 이를 위해, 하나 개의 아이디어는 다른 경기로 이동할 수있을 것입니다 내부 링크, 앵커에 즉

... 
return preg_replace($re, "<a name='$0' href='#'>$0</a>", $corpus); 
... 

별도 앵커의 이름 속성을 추가하는 것입니다. 예를 들어 아래 링크를 클릭하면 name='hello'이라는 앵커로 이동합니다.

<a href="#hello">Hello</a> 

문제는 : 내가 가진 문제는 name 속성에 대한 $0를 사용하여 일치하는 항목이 여러 개있을 수 있기 때문에, 일을하지 않는 것이다. JSFiddle에 더 긴 자료가있는 예를 참조하십시오. preg_replace을 사용하면서 고유 한 색인 값을 얻을 수있는 방법이 있습니까? 또는 아마도 일치하는 단어가 코퍼스에서 발견 된 위치를 반환 할 수있는 방법이 있습니까? 어쩌면 강조와 탐색을 얻는 또 다른 좋은 방법이있을 것입니다. 입력 해 주셔서 감사합니다

+0

'preg_replace_callback'이 소요 함수를'$ matches'를 인수로 사용한다면'strpos'와 함께 인덱스를 찾을 수 있습니다. – elclanrs

답변

1

의견에 제안 된대로 preg_replace_callback을 사용할 수 있지만 strpos을 사용하여 색인을 찾아 낼 필요가 없습니다. 대신 정적 변수를 호출 할 때마다 증가시키는 함수 내에서 정적 변수를 사용할 수 있습니다.

$text = 'a b c a b c a b c'; 
$text = preg_replace_callback(
      '/a/', 
      function($matches) { 
       static $i = 0; 
       return $matches[0].$i++; 
      }, 
      $text 
     ); 
echo $text; 

결과 출력 : 'abcabcabc'스트링을 취하고 캐릭터 'A'의 각각의 경우에의 인덱스를 추가

매우 기본적인 예

a0 b c a1 b c a2 b c 
+0

귀하의 솔루션에 대해 @MitchS를 고맙게 생각합니다. –

관련 문제