2010-06-17 6 views
4

나는이 검색 스크립트에서 대담한 검색 작업을 수행하려고 노력하고 있습니다. 단, 대소 문자를 구별하지 못한다는 점만 다릅니다. 내가 가지고있는 기능입니다PHP 대소 문자를 구분하지 않는 단어 바꾸기

function highlight($term,$target){ 
    $terms = explode(" ", $term); 

    foreach($terms as $term){ 
     $result = (eregi_replace($term, "<strong>$term</strong>", $target)); 
    } 
    return $result; 
} 

지금까지 .. 그것은 eregi_replace은 대소 문자를 구분하지 일치이지만 분명히 어떤 이유로 작동하지 않는 것을 PHP.net에 말했다. (나는 멍청이야.)

아이디어가 있으십니까? : D

답변

8

ereg_* (POSIX 정규 표현식) 기능은 PHP 5.3로 deprecated하고 오랫동안 제시되어 있지 않다. PCRE (preg_*) 함수 (예 : preg_replace)를 사용하는 것이 좋습니다.

당신은 <strong> 태그에 일치하는 항목을 포장 한 후 대소 문자를 구별하지 정규 표현식을 생성하고하면됩니다 :이 무엇

function highlight($term, $target) 
{ 
    $terms = array_unique(explode(" ", $term)); // we only want to replace each term once 
    foreach ($terms as $term) 
    { 
    $target = preg_replace('/\b(' . preg_quote($term) . ')\b/i', "<strong>$1</strong>", $target); 
    } 

    return $target; 
} 

그래서 당신 $term에 첫 번째 통화 preg_quote을하다 어떤 문자가있는 경우 그 용어에서 정규 표현식의 의미를 지니고 있으면 이스케이프 처리 된 다음 단어 경계로 둘러싸인 해당 용어를 찾는 정규 표현식을 만듭니다 (\b - 용어가 "좋음"인 경우 "작별 인사"와 일치하지 않음). . 이 용어는 괄호 안에 싸여 정규 표현식 엔진이 기존 형식의 용어를 "역 참조"(정규 표현식 엔진이 일치하는 부분에 매달리는 방식)로 캡처하게합니다. 표현식은 i 옵션을 지정하여 대소.자를 구분하지 않습니다. 마지막으로 일치 항목을 <strong> 태그로 둘러싸인 동일한 역 참조로 바꿉니다.

$string = "The quick brown fox jumped over the lazy dog. The quicker brown fox didn't jump over the lazy dog."; 
$terms = "quick fox"; 
highlight($terms, $string); 
// results in: The <strong>quick</strong> brown <strong>fox</strong> jumped over the lazy dog. The quicker brown <strong>fox</strong> didn't jump over the lazy dog. 

당신이 정규 표현식에 대한 좋은 자습서를 좋아 regular-expressions.info에 튜토리얼을 확인하세요.

+1

'str_ireplace'는 사용자가'clock'을 검색하면 텍스트의'Clock'을'clock'으로 변환합니다. 좋지 않은 옵션입니다. –

+0

좋은 지적, 나는 나의 대답을 업데이트 할 것이다. –

+0

@Pekka, 그는 대소 문자를 구분하지 않는 일치를 물었습니다. 왜 좋은 옵션이 아닌가요? 그것은 단지 그것을합니다. –

0
function highlight($term,$target) 
{ 
    $terms = explode(" ", $term); 

    foreach($terms as $term){ 
     $target = (str_ireplace($term, "<strong>$term</strong>", $target)); 
    } 
    return $target; 
} 
관련 문제