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 " ".
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 " ".
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;
}
Kommentar