FRIHOST FORUMS SEARCH FAQ TOS BLOGS COMPETITIONS
You are invited to Log in or Register a free Frihost Account!


Search function





Xcelerate
I searched the internet and couldn't find any useful search function that fit what I needed it to do. So I wrote one! And what's more, it searches XML databases (not MySQL).

Here it is below, with a sample family tree webpage included:

Code:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Search for family members</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>

<?php
//Search script
//Returns results in an array
if (isset($_POST['search']))
   {
   function search($searchword,$xml,$cycledegree,$searchdegree,$searchposition)
      /*   Search Function:
            Usage: search(search string, what xml file, cycle degree, search degree, search position);
            Example: search('Ed Thompson','databases/customers.xml', 2, 3, 4);
            Returns: An array containing the results, as indicated by the degree
      */
      {
      
      $find = array('`[^a-z0-9 ]`','` {2,}`');
      $replace = array('',' ');
      $searchwordmain = preg_replace($find,$replace,(trim(strtolower($searchword))));
      
      $separate = explode(' ',$searchwordmain);
      if ((count($separate)) > 1)
      $separate[count($separate)] = $searchwordmain;
      
      for ($a = 0; $a < count($separate); $a++)
         {
         $separatedetail[$a][0] = $separate[$a];
         $separatedetail[$a][1] = metaphone($separate[$a]);
         }
      
      $separate = $separatedetail;
      
      include("include/from_xml.php");
      
      $hold = $output;
      for ($e = 0; $e < count($cycledegree); $e++)
         {
         $hold = $hold[0]['children'];
         }
      $cycledegree = $hold;
      
      for ($b = 0; $b < count($cycledegree); $b++)
         {
         $score[$b] = 0;
         $name = $cycledegree[$b]['children'][$searchposition];
         if ($searchdegree!=0)
            {
            for ($e = 0; $e < count($searchdegree); $e++)
               {
               if ($e == (count($searchdegree)-1))
               $name = $name['children'];
               else
               $name = $name['children'][0];
               }
            }
         else
            {
            $name = $name['tagData'];
            }
         $topvalue = (count($name));
         if ($topvalue!=1)
         $name[$topvalue]['tagData'] = '';
         for ($c = 0; $c < count($name); $c++)
            {
            if ($topvalue==1)
               $namepart[$c][0] = preg_replace($find,$replace,(trim(strtolower($name))));
            else
               {
               if ($c!=$topvalue)
               $name[$topvalue]['tagData'] .= $name[$c]['tagData']." ";
               $namepart[$c][0] = preg_replace($find,$replace,(trim(strtolower($name[$c]['tagData']))));
               }
            $namepart[$c][1] = metaphone($namepart[$c][0]);
            for ($d = 0; $d < count($separate); $d++)
               {
               if ($separate[$d][0]==$namepart[$c][0])
               $score[$b] += 10;
               if (($separate[$d][0]!='') && ($namepart[$c][0]!=''))
                  {
                  if (((substr_count($separate[$d][0],$namepart[$c][0]))==1) || ((substr_count($namepart[$c][0],$separate[$d][0]))==1))
                  $score[$b] += 7;
                  }
               $difference = levenshtein($separate[$d][0],$namepart[$c][0]);
               if ($difference < 4)
               $score[$b] += 4-$difference;
               
               if ($separate[$d][1]==$namepart[$c][1])
               $score[$b] += 9;
               if (($separate[$d][1]!='') && ($namepart[$c][1]!=''))
                  {
                  if (((substr_count($separate[$d][1],$namepart[$c][1]))==1) || ((substr_count($namepart[$c][1],$separate[$d][1]))==1))
                  $score[$b] += 6;
                  }
               $difference = levenshtein($separate[$d][1],$namepart[$c][1]);
               if ($difference < 2)
               $score[$b] += 2-$difference;
               
               if (($d==(count($separate)-1)) && ($c==(count($name)-1)))
                  {
                  if ($separate[(count($separate)-1)][0]==$namepart[$c][0])
                  $score[$b] += 60;
                  if ($separate[(count($separate)-1)][1]==$namepart[$c][1])
                  $score[$b] += 40;
                  }
               }
            }
         }
      return ($score);
      }
      
   function lsort($input)
      {
      arsort($input);
      $namecount = count($input);
      $inputsave = $input;
      $score = 0;
      for ($a = 0; $a < ($namecount); $a++)
         {
         $checkarray = array_keys($inputsave,array_pop($input));
         if (count($checkarray) > 1)
            {
            for ($b = 0; $b < count($checkarray); $b++)
               {
               $output[$checkarray[$b]] = $score;
               if ($b!=(count($checkarray)-1))
                  {
                  array_pop($input);
                  $a++;
                  }
               }
            }
         else
            $output[$checkarray[0]] = $score;
         $score++;
         }
      ksort($output);
      return $output;
      }
      
   $xml = 'databases/relation_tree.xml';
   include("include/from_xml.php");
   
   $name = array_fill(0,count($output[0]['children']),0);
   $age = $name;
   $gender = $name;
   $address = $name;
      
   if (($_POST['fname']) != '')
      {
      $name = search($_POST['fname'],'databases/relation_tree.xml',1,1,0);
      $name = lsort($name);
      }
   if (($_POST['age']) != '')
      {
      $age = search($_POST['age'],'databases/relation_tree.xml',1,0,2);
      $age = lsort($age);
      }
   if (($_POST['gender']) != '')
      {
      $gender = search($_POST['gender'],'databases/relation_tree.xml',1,0,3);
      $gender = lsort($gender);
      }
   if (($_POST['address']) != '')
      {
      $address = search($_POST['address'],'databases/relation_tree.xml',1,1,4);
      $address = lsort($address);
      }
   
   for ($a = 0; $a < (count($output[0]['children'])); $a++)
      {
      $final[$a] = $name[$a]+$age[$a]+$gender[$a]+$address[$a];
      }
   
   arsort($final);
   }
else
   {
?>
<div style="width: 400px; margin-left: 30px;">
   Welcome to the search form!
   <br><br>
   Fill in as much as you know about the person, and the engine will attempt to figure out the rest.
   <br><br>
   You can leave fields empty if you wish.
   <br><br>
   You can also search by sounds.  For example, you can type 'enri', and 'Henry' will be a result.
</div>
<br><br>
<?php
   }
?>
<form name="search" action="search.php" method="post" style="margin-left: 30px; border: 1px solid #999999; padding: 10px; width: 280px;">
   <input name="fname" type="text" value="Name..." onFocus="if(this.value=='Name...') this.value='';" onBlur="if(this.value=='') this.value='Name...';" class="h1">
   <input name="age" type="text" value="Age..." onFocus="if(this.value=='Age...') this.value='';" onBlur="if(this.value=='') this.value='Age...';" class="h1">
   <br><br>
   <input name="gender" type="text" value="Gender..." onFocus="if(this.value=='Gender...') this.value='';" onBlur="if(this.value=='') this.value='Gender...';" class="h1">
   <input name="address" type="text" value="Address..." onFocus="if(this.value=='Address...') this.value='';" onBlur="if(this.value=='') this.value='Address...';" class="h1">
   <br><br>
   <input name="search" type="submit" value="Search" onClick="if(fname.value=='Name...') fname.value=''; if(age.value=='Age...') age.value=''; if(gender.value=='Gender...') gender.value=''; if(address.value=='Address...') address.value='';" class="h1">
</form>
<?php
if (isset($_POST['search']))
   {
   echo "<span style=\"margin-left: 30px;\">Results are below.  If you would like to search again, use the form above.</span>\n<br><br><br>\n";
   while (list($member,$score) = each($final))
      {
      if (!(isset($savescore)))
      {
         $savescore = $score;
         if ($score==0)
         break;
      }
      if ($savescore != $score)
      break;
      $savescore = $score;
      $simple = $output[0]['children'][$member]['children'];
      echo '<div style="width: 400px; margin-left: 30px;">'."\n\t".$simple[0]['children'][0]['tagData']." ".$simple[0]['children'][2]['tagData'].":\n\t<br>\n\t<blockquote>";
      echo $simple[5]['tagData']."</blockquote>\n</div>\n";
      }
   }
?>
</body>
</html>


The "from_xml.php" page is simply something I pulled from the PHP website to convert the database into an array:

Code:

<?php

if (!(class_exists("XmlToArray")))
{

   class XmlToArray {
    
      var $arrOutput = array();
      var $resParser;
      var $strXmlData;
    
      function parse($strInputXML) {
    
            $this->resParser = xml_parser_create ();
            xml_set_object($this->resParser,$this);
            xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");
            xml_set_character_data_handler($this->resParser, "tagData");
       
            $this->strXmlData = xml_parse($this->resParser,$strInputXML );
            if(!$this->strXmlData) {
               die(sprintf("XML error: %s at line %d",
            xml_error_string(xml_get_error_code($this->resParser)),
            xml_get_current_line_number($this->resParser)));
            }
                      
            xml_parser_free($this->resParser);
          
            return $this->arrOutput;
      }
      function tagOpen($parser, $name, $attrs) {
         $tag=array("name"=>$name,"attrs"=>$attrs);
         array_push($this->arrOutput,$tag);
      }
    
      function tagData($parser, $tagData) {
         if(ltrim($tagData)) {
            if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData'])) {
               $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= "\n\n".$tagData;
            }
            else {
               $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
            }
         }
      }
    
      function tagClosed($parser, $name) {
         $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
         array_pop($this->arrOutput);
      }
   }

}
$xmli = implode("\n",file($xml));
$object = new XmlToArray();
$output = $object->parse($xmli);
?>


If you need help fitting it to your website, PM me, and I'll be glad to help.
Related topics
ImageMagick
About ads and language
Search Fuction in user list
The Forum Search
integration of search engines
search script.
Search function server load relief.
Add to the search options
the best way to add a search function is?
Our Search
Search Script..?
PHP search function with MySQL fulltext
Where's the Member Search function located I can't find it ?
how could I change this search function?
Reply to topic    Frihost Forum Index -> Miscellaneous -> Tutorials

FRIHOST HOME | FAQ | TOS | ABOUT US | CONTACT US | SITE MAP
© 2005-2011 Frihost, forums powered by phpBB.