hello!

i have a problem with a search-and-highlight script (see code below):

a search for "byt tes" matches entries that contain "bytes" but only
highlights "byt"*.

*) because after the first search term ("byt") is found the line is modified
into <span class="highlight">byt</span>es and therefore the secound search
term ("tes") can't be highlighted anymore.


1. general question

i'm not quite sure if a search like this should match entries that contain a
combination of both terms ("bytes").
of course, the word "bytes" contains both search terms - but on the other
hand, a search for "byt tes" indicates that i'm looking for TWO terms (and
also for TWO "t"s).


2. how to do it anyway?

do you have an idea how to accomplish that this kind of search
- either: does NOT display entries that match "bytes"
- or: displays entries that contain "bytes" and highlights "bytes"

(because both solutions seem to be somehow logical it may depend on the
easiness of creation and/or the speed of processing.)


thanks a lot for your effort!!

best wishes

philipp
www.ipdraw.org


---
code

notes:
- the highlight/preg_replace part is built to skip html tags.
- if you have any other suggestions for improvements, please let me know.


if (isset($src)) {

  if (preg_match("/[A-z]/", $src) | preg_match("/[0-9]/", $src)) {

  $src = stripslashes($src);
  $src = preg_replace("/\,/i", " ", $src);
  $src = html_entity_decode($src);
  $src = preg_replace("/&nbsp;/i", " ", $src);
  $src = preg_replace("/[[:space:]]+/i", " ", $src);
  $src = trim($src);

  $handle = fopen($entries, "r");
  $i = 1;
  $results = 0;

  while ($i <= $dbs_total) {
      $buffer = fgets($handle, 4096);
      $buffer_raw = strip_tags($buffer);
      $buffer_raw = preg_replace("/&nbsp;/i", " ", $buffer_raw);

      $words = explode(' ', $src);
      $t = 0;
      $test='return(';
      foreach($words as $word)
      {
          if($t>0)$test.=' && ';
          $test.='strstr($buffer_raw,\''.$word.'\')';
          $t++;
      }
      $test.=');';
      // 01:A
      if (eval($test)) {
      foreach($words as $word)
      {
      $wordreg = preg_replace('/([\.\*\+\(\)\[\]])/','\\\\\1',$word);
      $buffer = 
preg_replace('/(<)([^>]*)('.("$wordreg").')([^<]*)(>)/sei',"'\\1'.preg_repla
ce('/'.(\"$wordreg\").'/i','###','\\2\\3\\4').'\\5'",stripslashes($buffer));
      $buffer = preg_replace('/('.$wordreg.')/si','<span
class="highlight">\\1</span>',stripslashes($buffer));
      $buffer = preg_replace('/###/si',$word,$buffer);
      }
      echo $buffer;
      $results++;
      }
      $i++;
    }
    fclose ($handle);
  } else {
  $illegal_src = 1;
  }
}


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to