Version: 1.0
Type: Function
Category: Algorithms
License: GNU General Public License
Description: This will format a boolean keyword search into an array that you can use to search any source.
<?
/*
search.php by Trevor Linton
BOOLEAN KEYWORD SEARCH FUNCTION
This allows anyone to execute a boolean keyword search. This can be used for a search engine of any type. This function does not actually do the search but rather
takes the users inputted data and formats it into an Array in which your own customized function can used to execute a SQL search, or grep files, etc.. Only one function
exists called cutBoolean (with another function attach_array to help it). They syntax is below along with how the array is structured that's returned.
This supports grouping items with ( ), keywords AND, OR, NOT and quoted items " " it will also default anything without a keyword to an AND keyword. Such as, if you pass in
'Linux PHP' the progarm will assume 'Linux AND PHP' and treat it as two keywords given, if you pass in: ' "Linux PHP" ' (basically the word enclosed with quotes) it will
correctly assume just one keyword "Linux PHP".
Example:
nursers AND malpractive NOT doctors
Will return:
x[0][0]["keyword"] = "nursers"
x[0][0]["keyword"]= "malpractice"
x[0][0]["attrib"] = "+"
x[0][1]["keyword"] = "doctors";
x[0][1][attrib"] = "-"
x is the variable array
The first array is the group
The second array is the keyword in the group
The ["keyword"] specifies the actualy text keyword (case sensetive)
The ["attrib"] is either + or - for include or exclude in that group.
to execute:
cutBoolean(boolean_keywords string, level int, default_attrib char);
level and default_attrib should always be initalized as 1 and '+'.
*/
function array_attach($dArray,$sArray) {
// find the last id in $dArray
$last_id = count($dArray);
for($i=0; $sArray[$i] ; $i++) {
$dArray[$last_id] = $sArray[$i];
$last_id++;
}
return($dArray);
}
function cutBoolean($boolean, $level,$attrib) {
$split = explode( " ",$boolean);
$grpIndex = 0;
$keyIndex = 0;
$group = Array();
for($i=0; $i < count($split) ;$i++) {
// check for beginning group
if($split[$i][0]=="(") {
$tmp = "";
$count = 0;
$count += substr_count($split[$i], "(");
$count -= substr_count($split[$i], ")");
for($j=($i +1); $count != 0 ; $j++) {
$count += substr_count($split[$j], "(");
$count -= substr_count($split[$j], ")");
if($j > count($split))
break;
}
// now we have in $j where the group ends. concat all strings then return it as a group
for($n=$i; $n != $j ;$n++)
$tmp .= " ".$split[$n];
$tmp= ltrim(rtrim($tmp));
if($tmp[0] == '(' && $tmp[strlen($tmp)- 1 ] == ')')
$tmp = substr(substr($tmp, 1, strlen($tmp)), 0,strlen($tmp) -2);
// add this array to the end of the other!
$group = array_attach($group, cutBoolean($tmp, ($level + 1), $attrib));
$i=($j - 1);
} else if($split[$i][0]=="\\" && $split[$i][1] == "\"") {
$tmp = $split[$i];
if($tmp[strlen($tmp) -1 ] != "\"") {
for($j=($i+1);;$j++) {
$tmp .= " ".$split[$j];
if(substr_count($split[$j],'"') != 0)
break;
}
$i=$j;
}
$tmp = substr(substr($tmp, 2, strlen($tmp)), 0,strlen($tmp) -4);
$group[$grpIndex][$keyIndex]["keyword"] =$tmp;
$group[$grpIndex]["attrib"] = $attrib;
$keyIndex++;
} else {
switch($split[$i]) {
case 'AND':
if($not==true) {
$attrib='+';
$not = false;
}
break;
case 'OR':
if($not==true) {
$attrib='+';
$not = false;
}
$grpIndex++;
$keyIndex = 0;
break;
case 'NOT':
$not = true;
$attrib = '-';
$grpIndex++;
$keyIndex = 0;
break;
case '':
break;
case ' ':
break;
default:
if($not==true) {
$group = array_attach($group, cutBoolean($split[$i], ($level + 1), $attrib));
} else {
$group[$grpIndex][$keyIndex]["keyword"] = $split[$i];
$group[$grpIndex]["attrib"] = $attrib;
$keyIndex++;
}
break;
}
}
}
return($group);
}
echo("<b>DEBUG INFO<b><hr noshade size=0 width=100%>Query '$search'.</b><br><br>\n");
?>
<table border="1" cellpadding="0" width="100%" cellspacing="3">
<tr>
<td><b>Group</b></td><td><b>Attribute</b></td><td><b>Keyword(s)</b></td>
</tr>
<?
$groups = cutBoolean($search,0,'+');
for($i=0 ; $groups[$i] ;$i++ ) {
?>
<tr>
<td><?echo($i);?></td>
<td><?echo($groups[$i]["attrib"]);?></td>
<td>
<?
for($j=0; $groups[$i][$j] ; $j++) {
echo("[".$j."] ".$groups[$i][$j]["keyword"]."<br>\n");
}
?>
</td>
<?
}
?>
</table><br><br>