| 
	
 | 
 Posted by "Gustav Wiberg" on 09/07/05 21:10 
----- Original Message -----  
From: "Paul Groves" <paul.groves@computing-services.oxford.ac.uk> 
To: "Gustav Wiberg" <gustav@varupiraten.se> 
Cc: "PHP General" <php-general@lists.php.net> 
Sent: Wednesday, September 07, 2005 5:45 PM 
Subject: Re: [PHP] Breaking up search terms into an array intelligently 
 
 
> Gustav Wiberg wrote: 
>> ----- 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/ 
>> 
>> 
>> 
> 
> Thanks  - this helps to an extent (espc. with how to deal with "+" and "-"  
> delimiters), but doesn't (I think) solve the problem of how to treat parts  
> of search terms in quotes as single search terms (like Google does), espc.  
> as quotes get stripped out in your example. Nor does it deal with the  
> problem of muliple spaces between search terms, though that's relatively  
> easy to fix using the enhanced_explode() function above. 
> 
> regards 
> 
> 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 
> 
> 
Ok, glad to help a little bit anyway! :-) 
 
Please do send code if you have any better solution! 
 
/G 
http://www.varupiraten.se/
 
  
Navigation:
[Reply to this message] 
 |