Re: Breaking up search terms into an array intelligently

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



It sounds like you are trying to build a full text search string, perhaps for searching a MySQL database? Below is the function I came up with a while ago. It's worked fine, although it currently does not check for multiple spaces, but that should be easy to change. It uses a space as a delimiter and it checks for quotes for searching on phrases. It returns the search string for a MySQL full text boolean mode search. You should be able to easily adapt it to your specific needs.

    function prepFullTextSearch($searchVal) {
        //Split words into list
$word_List = explode(' ',stripslashes(trim ($searchVal)));
        //Step through word list to get search phrases
        $i                        = 0;
        $isPhrase                = false;
        foreach($word_List as $word) {
$searchItems[$i] = trim(($isPhrase?$searchItems[$i].' '.$word:$word));
            //Check for start of Phrase
            if(substr($searchItems[$i],0,1) == '"') {
                $isPhrase        = true;
            }
//If not building a phrase, append wildcard (*) to end of word
            if(!$isPhrase) {
                $searchItems[$i]    .= '*';
                $i++;
            }
            //Check for end of Phrase
            if(substr($searchItems[$i],-1) == '"') {
                $isPhrase        = false;
                $i++;
            }
        }
        $searchVal                = '+'.implode(' +',$searchItems);
        return $searchVal;
    }



On Sep 7, 2005, at 10:54 AM, Paul Groves wrote:

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




--
Brent Baisley
Systems Architect
Landover Associates, Inc.
Search & Advisory Services for Advanced Technology Environments
p: 212.759.6400/800.759.0577

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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux