Huhu,
bin gerade dabei, 'ne gescheite Search Engine zu programmieren.
Möglich sind folgende Formatierungen des Suchbegriffes:
- Als Wildcard das *
- AND, OR, NOT um die Suche einzuschränken
- Text innerhalb zwei " wird als exakte Wortgruppe gesucht
Desweitern werden dem Script noch per Formular die Datenbank-Felder (MySQL) geliefert (in einem Array), in denen gesucht werden soll.
Ich habe nun untenstehende Funktion geschrieben / gebastelt (ist wohl der treffendere Ausdruck )
)
eigentlich funktioniert sie schon recht gut (für meine Aspekte ), das einzige Problem ist das Behandeln der Suchterme innerhalb der " ".
), das einzige Problem ist das Behandeln der Suchterme innerhalb der " ".
Meine Fragen an Euch:
Wie kann ich das ganze noch optimieren?
Wie löse ich das Problem mit den " ", welchen Ausdruck muss ich bei preg_match nehmen?
Stimmt das so mit den Wildcards?
(dass er standardmässig ein "AND" an den Anfang setzt ist so in Ordnung!)
Input:
$arg = Der vom User eingegebener Suchbegriff (immer mit addslashes() maskiert)
$what = In welchen DB-Felder gesucht werden soll, in 'nem Array
$exact = eher unwichtig, entscheidet einfach darüber, ob LIKE oder = genutzt werden soll, als Übergabewerte gibts 'exact' und 'part'
	
							
						
					bin gerade dabei, 'ne gescheite Search Engine zu programmieren.
Möglich sind folgende Formatierungen des Suchbegriffes:
- Als Wildcard das *
- AND, OR, NOT um die Suche einzuschränken
- Text innerhalb zwei " wird als exakte Wortgruppe gesucht
Desweitern werden dem Script noch per Formular die Datenbank-Felder (MySQL) geliefert (in einem Array), in denen gesucht werden soll.
Ich habe nun untenstehende Funktion geschrieben / gebastelt (ist wohl der treffendere Ausdruck
 )
)eigentlich funktioniert sie schon recht gut (für meine Aspekte
 ), das einzige Problem ist das Behandeln der Suchterme innerhalb der " ".
), das einzige Problem ist das Behandeln der Suchterme innerhalb der " ".Meine Fragen an Euch:
Wie kann ich das ganze noch optimieren?
Wie löse ich das Problem mit den " ", welchen Ausdruck muss ich bei preg_match nehmen?
Stimmt das so mit den Wildcards?
(dass er standardmässig ein "AND" an den Anfang setzt ist so in Ordnung!)
Input:
$arg = Der vom User eingegebener Suchbegriff (immer mit addslashes() maskiert)
$what = In welchen DB-Felder gesucht werden soll, in 'nem Array
$exact = eher unwichtig, entscheidet einfach darüber, ob LIKE oder = genutzt werden soll, als Übergabewerte gibts 'exact' und 'part'
PHP-Code:
	
	
// converts the search string so it can be used in a sql statement
function convertSearchString($arg, $what, $exact="part") {
  function getClause($arg, $mod, $what, $exact) {
      
    if($exact == "exact")
    {
      $end   = "'";
      $start = ($mod == "NOT") ? "!='" : "='";
    } else {
      $end   = "%'";
      $start = ($mod == "NOT") ? " NOT LIKE '%" : " LIKE '%";
    }
    
    $mod    = ($mod == "NOT") ? "AND" : $mod;
    $clause   = "";
    while(list(, $val) = each($what))
    {
    
      $clause .= " ".$mod." ".$val.$start.$arg.$end;
      
    } /* end while */
      
   return $clause;
  
  }
      
  // var to return
  $out = "";
      
  // wildcard
  $arg = str_replace("*", "%", $arg);
      
  // get out the exact phrases
  if (preg_match('/\"[^\"]*\"/', $arg, $tmp))
  {
    while (list(, $val) = each($tmp))
    {
      $out .= getClause(str_replace('\"', '', $val), "AND", $what, $exact);
    }
    $arg = preg_replace("/\"[^\"]*\"/", "", $arg);
  } /* end if */
      
  // split up the search string
  $params = explode(" ", $arg);
      
  for ($i=0; $i<count($params); $i++)
  {
    if ($params[$i] == "AND" || $params[$i] == "OR" || $params[$i] == "NOT") {
      $out .= getClause($params[$i+1], $params[$i], $what, $exact);
    } else {
      if (!strpos($out, $params[$i]))
      {
        $out .= getClause($params[$i], "AND", $what, $exact);
      } /* end if */
    } /* end else */
  } /* end for */
      
 return $out;      
} 
 
          
 Search "Engine"
									
									
									Search "Engine"
								
Kommentar