|
Posted by "Gustav Wiberg" on 09/07/05 18:15
----- Original Message -----
From: "Paul Groves" <paul.groves@oucs.ox.ac.uk>
To: <php-general@lists.php.net>
Sent: Wednesday, September 07, 2005 4:54 PM
Subject: [PHP] Breaking up search terms into an array intelligently
>I want to be able to break up a number of search terms typed into an input
> box into array, simple enough one would think, just use explode, e.g
>
>
> $array = explode(" ", $string);
>
>
> But what if I want to be able to cope with search terms seperated by > 1
> space (a common typing error)? This should work:
>
>
> function enhanced_explode($string) {
> $array = preg_split ("/\s+/", $string);
> return ($array);
> }
>
>
> But what if I want to allow "Google"-type search parameters, so that
> something like the following is split into 3 search terms?:
> firstsearchterm "second search term" thirdsearchterm
> The following code will do the trick, but is slow and doesn't allow for
> multiple spaces as the delimiter, nor the possibility of multiple
> delimiters
> (e.g. " ", "+", "," etc.)
>
>
> function explode2($delimeter, $string)
> {
> for ($i = 0; $i < strlen($string); $i++)
> {
> if ($string{$i} == '"')
> {
> if ($insidequotes)
> $insidequotes = false;
> else
> $insidequotes = true;
> }
> elseif ($string{$i} == $delimeter)
> {
> if ($insidequotes)
> {
> $currentelement .= $string{$i};
> }
> else
> {
> $returnarray[$elementcount++] = $currentelement;
> $currentelement = '';
> }
> }
> else
> {
> $currentelement .= $string{$i};
> }
> }
>
> $returnarray[$elementcount++] = $currentelement;
>
> return $returnarray;
> }
>
> None of these solutions are ideal, I guess a clever regular exression
> (preg_split) could solve this, but I'm not quite sure how - does anyone
> have
> any ideas? Thanks
>
> Paul
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
>
> --
> No virus found in this incoming message.
> Checked by AVG Anti-Virus.
> Version: 7.0.344 / Virus Database: 267.10.18/91 - Release Date: 2005-09-06
>
>
Hi Paul!
I guess you're looking for something like this?
$sql = "SELECT ID From tbTempTable";
$search = $_GET["frmSearch"];
$search = trim($search);
$search = strtolower($search);
//Delete all occurances of " (chr(34)) in search-string
//Delete all occurances of \ (chr(92)) in search-string
$search = str_replace(chr(34),"",$search);
$search = str_replace(chr(92),"",$search);
//Divide search - string into an array
//
$searcharray = explode(" ",$search);
//Go through search-array if several words are type
//within search-string
//
$firstSQL = "WHERE";
for ($i=0;$i<count($searcharray);$i++) {
//Check for occuarances of +,- or "" and search in right manner...
//
$notset = "LIKE";
$orset ="OR";
//If + then don't search for +, only rest of searcharray
//
if (substr($searcharray[$i],0,1) == "+") {
$searcharray[$i] = substr($searcharray[$i],1,
strlen($searcharray[$i])-1);
}
//If - then don't search for +, only rest of searcharray
//and add NOT LIKE to search-criteria
//
if (substr($searcharray[$i],0,1) == "-") {
$notset = "NOT LIKE";
$orset ="AND";
$searcharray[$i] = substr($searcharray[$i],1,
strlen($searcharray[$i])-1);
}
$sa = mysql_real_escape_string($searcharray[$i]);
//Freetext search
//
if ($_GET["frmFreeText"] == 'on') {
$sql .= " " . $firstSQL . " (tbvotes.titleJoke $notset '%" . $sa .
"%'";
$sql .= " $orset tbvotes.Joke $notset '%" . $sa . "%'";
$sql .= " $orset nameOfUser $notset '%" . $sa . "%'";
$sql .= " $orset tbvotes.nrOfVotes $notset '%" . $sa . "%'";
$sql .= ")";
}
//Titlesearch
//
if ($_GET["frmTitle"] == 'on') {
$sql .= " " . $firstSQL . " (tbvotes.titleJoke $notset '%" . $sa .
"%'";
$sql .= ")";
}
//Avs search
//
if ($_GET["frmFrom"] == 'on') {
$sql .= " " . $firstSQL . " (tbvotes.fromJoke $notset '%" . $sa .
"%'";
$sql .= ")";
}
//Nr of votes - search
//
if ($_GET["frmVotes"] == 'on') {
$sql .= " " . $firstSQL . " (tbvotes.nrOfVotes $notset '%" . $sa .
"%'";
$sql .= ")";
}
//Grade - search
//
if ($_GET["frmGrade"] == 'on') {
$sql .= " " . $firstSQL . " ((totalValueJoke / nrOfVotes) $notset
'%" . $sa . "%'";
$sql .= ")";
}
//Set AND if more than word typed in...
//
$firstSQL = "AND";
}
}
//END Search now...
//
//echo $sql;
I hope it will give you a clue into right direction... :-)
/G
http://www.varupiraten.se/
Navigation:
[Reply to this message]
|