Re: Breaking up search terms into an array intelligently

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

 



Gustav Wiberg wrote:
----- Original Message ----- From: "Paul Groves" <paul.groves@xxxxxxxxxxxxx>
To: <php-general@xxxxxxxxxxxxx>
Sent: Wednesday, September 07, 2005 4:54 PM
Subject:  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


[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