2010-04-07 1 views
6

:텍스트 강조, 나는 텍스트의 일부 키워드를 강조하기 위해 아래 코드를 사용하고

$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message); 

예를 <img>, <strong>를 들어, 일부 HTML 태그가 포함되는 텍스트, 등

html 태그 사이의 텍스트를 제외하고 "일반"텍스트를 어떻게 강조 할 수 있습니까? 사용자가 "img"를 검색 할 때 <img> 텍스트가 강조 표시되고 이미지가 더 이상 작동하지 않기 때문입니다.

+0

http://stackoverflow.com/questions/2590862/match-multiple-terms-within-body-tags/2590969#2590969에서 응답에 따라 단지 시간 전!) – bobince

답변

5

일종의 DOM 파서를 사용하십시오. 이것은 당신이 정규식으로하고 싶은 것이 아닙니다.

2

http://forum.phpfrance.com/vos-contributions/remplacement-selectif-hors-dans-balises-html-t199.html

function mon_rplc_callback($capture){ 
    global $arg; 
    return ($arg['flag'] == 1) 
    ? $arg['fct']($arg['from'], $arg['to'], $capture[1]).$capture[2] 
    : $capture[1].$arg['fct']($arg['from'], $arg['to'], $capture[2]); 
} 

function split_tag($from, $to, $txt, $fct, $flag = 1){ 
    global $arg; 
    $arg = compact('from', 'to', 'fct', 'flag'); 
    return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $txt); 
} 

에서 $ 플래그 == 1 교체 기능 HTML 외부인가되는 경우. $ flag == -1 일 경우 대체 기능이 HTML 내부에 적용됩니다. 귀하의 예제에 적용

는,이 같은 것을 줄 것이다 :

echo split_tag($words, '<span class="hightlighted_text">'.$words.'</span>', $message, 'str_ireplace', 1); 

을 즐기십시오! ;)

+0

고마워요.하지만 HTML 파서가 없습니다. 위의 포스터는 html 파서가이 경우에 더 좋을 것이라고 말했습니다. (??) – Arjen

+0

그리고 저는 정규 표현식이 매우 훌륭한 일을 할 수 있다고 말합니다. 또한 유효한 HTML 코드가 필요하지 않습니다. 그냥 작동합니다. – Savageman

+0

답장을 보내 주셔서 감사합니다. 유일한 문제는 키워드 (강조 표시되어야 함)에 모든 영문자가 포함되어있어 메모리 누수 오류가 발생하는 경우입니다. – Arjen

0

더 나은 코드 (@Savageman

$str = '<a href="ba">ba</a>'; 
$highlightWhat = "ba"; 
$str = preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', function($m) use ($highlightWhat) { 
      return preg_replace('~('.$highlightWhat.')~i', '<span style="background:#fff330">$1</span>', $m[1]) . $m[2]; 
     }, 
     $str); 
관련 문제