Подкрасить результаты поиска

Лисю

Guest
Подкрасить результаты поиска

Привет.
Делаю поиск по тексту, like, и вот зхахотел выделять найденные слова краснымс бэкграундом.

Возникла серьёзная проблема - в тексте, где производится поиск, возможен и html, и BB теги.
Т.е. при поиске скажем слова "форум" я могу наткнуться на код ..<a title="Это форум для новичков".., и программа заменит слово форум на эквивалент с полужирным выделением. Это уже ошибка. А я HTML отдаю как xhtml+xml - Мозила сразу умирает от этого.

Так же и при поиске англоязычнго слова типа title получится чёрте что.

Поиск произвродится в ленте новостей.
Очень хорошо получать результаты поиска с выделенными ключевыми словами, но боюсь мне придётся отказаться от хзатеи выделять слова. Что посоветуете?
 

Лисю

Guest
межу тегами? пример можно? что-то с трудом себе такое представляю..
 

whirlwind

TDD infected, paranoid
/>(.*?)</

-~{}~ 24.11.05 13:40:

Вообще, не мешало бы поподробнее раскрыть задачу и средства. А то непонятно на чем делаем: like - вроде бы средство БД, а вопрос в PHP-конфу...
 

white phoenix

Новичок
PHP:
function highlight_text($text="",$words=array())
{
 $tagflag = 0;
 for($i=0;$i<strlen($text);$i++)
 {
  if ($text{$i} == "<") {$tagflag++;}
  elseif ($text{$i} == ">") {$tagflag--; if ($tagflag < 0) {$tagflag = 0;}}
  else
  {
   if ($tagflag == 0)
   {
    foreach($words as $word) 
    {
     if (substr($text,$i,strlen($word)) == $word)
     {
      $hl = "<b>".$word."</b>";
      $text = substr($text,0,$i).$hl.substr($text,$i+strlen($word));
      $i += strlen($hl);
     }
    }
   }
  }
 }
 return $text;
}
echo highlight_text(
	'<a title="Simple title for link" href="/for/simple/text">Simple text for link</a>',
	array("text","link")
);
// <a title="Simple title for link" href="/for/simple/text">Simple <b>text</b> for <b>link</b></a>
чисто подумалось.. но это решение далеко не оптимальное, правильнее написать регулярное выражение.
 

Лисю

Guest
whirlwind

Раскрашиваю я не средствами БД, а средствами PHP.

white phoenix
респект.
 

whirlwind

TDD infected, paranoid
PHP:
$params = array_slice($argv,1);
if ( count($params) < 2 ) exit(1);
$filename = $params[0];
$words = array_slice($params,1);
echo higlight(file_get_contents($filename),$words);

function higlight($text,$words){
	$re = "/(>?.*?)(".join("|",$words).")(.*?<?)/i";
	return preg_replace($re,"\$1<b>\$2</b>\$3",$text);
}
PS. Форум загрыз бэкслеши в строке замены
 
Сверху