Re: Breaking up search terms into an array intelligently

From: Date: Wed, 07 Sep 2005 20:42:18 +0000
Subject: Re: Breaking up search terms into an array intelligently
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-221993@lists.php.net to get a copy of this message
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

« previous php.general (#221993) next »