2011-12-15 3 views
4

내 웹 사이트에서 "Tales of an Ancient Empire"를 검색한다고 가정 해 봅시다. 데이터베이스가 전체 텍스트 검색을 수행하고 결과가 표시됩니다. 나는PHP 검색 결과 강조 스크립트

function sublinhamos($text, $words) { 

    // explode the phrase in words 
    $wordsArray = explode(' ', $words); 

    // loop all searched words 
    foreach($wordsArray as $word) { 
     //highlight 
     $text = str_ireplace($word, "<span class=\"highlight\">".strtoupper($word)."</span>", $text, $count); 
    } 
    //right trows results 
    return $text; 
} 

thngy 하이라이트에 대해이 기능이 그것의 너무 나쁜하지만 str_ireplace가 이미 삽입 SPAN의가 발생 "이 발견 될 때 월로 용어,"고대 제국의 이야기 "이기 때문에 여기에 문제는 없습니다 검색 용어의 단어를 입력하고 SPAN 태그를 분리하십시오.

단어의 일부를 강조 표시하려면 강조 표시가 필요하고 최소 2 자까지 모든 단어를 강조해야하지만 예전의 SPAN 발생 문제를 제외하고는 모두 훌륭합니다.

어떤 아이디어로주세요?

답변

5

글쎄, 시작하려면 스팬을 사용하지 않을 것입니다.

<mark></mark> 

이 더 나은 요소입니다. 이런 목적으로 텍스트의 일부분을 강조하는 것이 목적입니다. 자세한 내용은 this article을 참조하십시오.

function sublinhamos($text, $words) { 
    $wordsArray = array(); 
    $markedWords = array(); 
    // explode the phrase in words 
    $wordsArray = explode(' ', $words); 

    foreach ($wordsArray as $k => $word) { 
     $markedWords[$k]='<mark>'.$word.'</mark>'; 
    } 

    $text = str_ireplace($wordsArray, $markedWords, $text); 

    //right trows results 
    return $text; 
} 
+1

사용자가 "마크"를 검색 할 수도 있기 때문에 문제가 해결되지 않을 수도 있습니다. – mishu

+0

@mishu 그는 방금 알아 챘습니다. 그의 해결책은 한 번에 루프로 교체하는 것이 아니라 어레이로 교체하는 것입니다. 나는 그것을 좋아한다. +1 – Flo

+0

글쎄, 테스트하고 결과에 (테스트 용으로 생성 된) 이상한 단어를 테스트 해본 결과, 마크를 검색해도 출력이 손상되지 않았기 때문에 아마도 ... – eduardev

1

대신 어떤 검색됩니다 임시 문자열을 대체 할 수있다. (예 : {{{와}}})이 같은 : 간단한을 바로 할 수

$text = str_ireplace($word, "{{{".strtoupper($word)."}}}", $text, $count); 

모든 히트 곡을 표시 한 후 임시 문자열을 span 태그로 바꾸십시오.

0

당신은 부정적인 모습 숨김 대신으로 preg_replace이다를 사용할 수 있습니다 :

$text = preg_replace('/(?<!<sp)(?<!<\/sp)(an)/i', '<span class="highlight">$1</span>', $text); 

첫 번째 숨김 모습 시작입니다 또한

, 당신은 예를 들어, 않는 str_replace로 배열을 전달할 수 있습니다 span 태그 및 종료 태그 용 두 번째 아마도 당신은 하나에 그들을 결합 할 수 있지만 확실하지 않습니다.

0

시도해 보셨습니까?

$text = preg_replace("|($word)|", "<span class=\"highlight\">".strtoupper($word)."</span>", $text, $count);