<?php
//error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
function swap_max(&$arr, $start, $domain) {
$pos = $start;
$maxweight = $arr[$pos]['weight'];
for ($i = $start; $i< count($arr); $i++) {
if ($arr[$i]['domain'] == $domain) {
$pos = $i;
$maxweight = $arr[$i]['weight'];
break;
}
if ($arr[$i]['weight'] > $maxweight) {
$pos = $i;
$maxweight = $arr[$i]['weight'];
}
}
$temp = $arr[$start];
$arr[$start] = $arr[$pos];
$arr[$pos] = $temp;
}
function sort_with_domains(&$arr) {
$domain = -1;
for ($i = 0; $i< count($arr)-1; $i++) {
swap_max($arr, $i, $domain);
$domain = $arr[$i]['domain'];
}
}
function sort_by_bestclick(&$arr) {
$click_counter = -1;
for ($i = 0; $i< count($arr)-1; $i++) {
swap_click($arr, $i, $click_counter);
$click_counter = $arr[$i]['click_counter'];
}
}
function swap_click(&$arr, $start, $click_counter) {
$pos = $start;
$maxclick = $arr[$pos]['click_counter'];
for ($i = $start; $i< count($arr); $i++) {
if ($arr[$i]['click_counter'] == $domain) {
$pos = $i;
$maxclick = $arr[$i]['click_counter'];
break;
}
if ($arr[$i]['click_counter'] > $maxclick) {
$pos = $i;
$maxclick = $arr[$i]['click_counter'];
}
}
$temp = $arr[$start];
$arr[$start] = $arr[$pos];
$arr[$pos] = $temp;
}
function cmp_weight($a, $b) {
if ($a['weight'] == $b['weight'])
return 0;
return ($a['weight'] > $b['weight']) ? -1 : 1;
}
function cmp_dom_dot($a, $b) {
$dots_a = substr_count($a['domain'], ".");
$dots_b = substr_count($b['domain'], ".");
if ($dots_a == $dots_b)
return 0;
return ($dots_a < $dots_b) ? -1 : 1;
}
function cmp_path_dot($a, $b) {
$path_a = preg_replace('/([^/]+)$/i', "", $a['path']); // get path without filename
$path_b = preg_replace('/([^/]+)$/i', "", $b['path']); // get path without filename
$dots_a = substr_count($path_a, ".");
$dots_b = substr_count($path_b, ".");
if ($dots_a == $dots_b)
return 0;
return ($dots_a < $dots_b) ? -1 : 1;
}
function cmp_path_slash($a, $b) {
$path_a = preg_replace('/([^/]+)$/i', "", $a['path']); // get path without filename
$path_b = preg_replace('/([^/]+)$/i', "", $b['path']); // get path without filename
$slash_a = substr_count($a['path'], "/");
$slash_b = substr_count($b['path'], "/");
if ($slash_a == $slash_b)
return 0;
return ($slash_a < $slash_b) ? -1 : 1;
}
function addmarks($a) {
$a = preg_replace("/[ ]+/i", " ", $a);
$a = str_replace(" +", "+", $a);
$a = str_replace(" ", "+", $a);
return $a;
}
function makeboollist($a, $type) {
global $entities, $stem_words, $case_sensitive, $del_secchars, $cn_seg;
while ($char = each($entities)) {
$a = preg_replace("/$char[0]/i", $char[1], $a);
}
$strictpos = strpos($a, '!'); // if ! is in position 0, we do have to search strict
if ($strictpos === 0) {
} else {
if ($type != "phrase") { // delete secondary characters from query, but not for STRICT search
$search = "1";
$a = del_secchars($a, $search);
}
}
$a = trim($a);
$a = preg_replace("/"/i", "\"", $a);
$returnWords = array();
//get all phrases
$regs = Array();
while (preg_match("/([-]?)\"([^\"]+)\"/i", $a, $regs)) {
if ($regs[1] == '') {
$returnWords['+s'][] = $regs[2];
$returnWords['hilight'][] = $regs[2];
} else {
$returnWords['-s'][] = $regs[2];
}
$a = str_replace($regs[0], "", $a);
}
if ($case_sensitive == 1) {
$a = preg_replace("/[ ]+/i", " ", $a);
} else {
$a = preg_replace("/[ ]+/", " ", $a);
}
// $a = remove_accents($a);
$a = trim($a);
$words = explode(' ', $a);
if ($a=="") {
$limit = 0;
} else {
$limit = count($words);
}
$k = 0;
//get all words (both include and exlude)
$includeWords = array();
while ($k < $limit) {
if (substr($words[$k], 0, 1) == '+') {
$includeWords[] = substr($words[$k], 1);
if (!ignoreWord(substr($words[$k], 1))) {
$returnWords['hilight'][] = substr($words[$k], 1);
if ($stem_words != 'none') {
$returnWords['hilight'][] = stem_word(substr($words[$k], 1), $type);
}
}
} else if (substr($words[$k], 0, 1) == '-') {
$returnWords['-'][] = substr($words[$k], 1);
} else {
$includeWords[] = $words[$k];
if (!ignoreWord($words[$k])) {
$returnWords['hilight'][] = $words[$k];
if ($stem_words != 'none') {
$returnWords['hilight'][] = stem_word($words[$k], $type);
}
}
}
$k++;
}
//add words from phrases to includes
if (isset($returnWords['+s'])) {
foreach ($returnWords['+s'] as $phrase) {
if ($case_sensitive == '0') {
$phrase = lower_ent($phrase);
$phrase = lower_case(preg_replace("/[ ]+/i", " ", $phrase));
} else {
$phrase = preg_replace("/[ ]+/i", " ", $phrase);
}
$phrase = trim($phrase);
$temparr = explode(' ', $phrase);
foreach ($temparr as $w)
$includeWords[] = $w;
}
}
foreach ($includeWords as $word) {
if (!($word =='')) {
if (ignoreWord($word)) {
$returnWords['ignore'][] = $word;
} else {
$returnWords['+'][] = $word;
}
}
}
return $returnWords;
}
function ignoreword($word) {
global $common;
global $min_word_length;
global $index_numbers;
if ($index_numbers == 1) {
$pattern = "[a-z0-9]+";
} else {
$pattern = "[a-z]+";
}
if (strlen($word) < $min_word_length || ($common[$word] == 1)) {
return 1;
} else {
return 0;
}
}
function links_only($searchstr, $type, $possible_to_find, $db_slv) {
global $mysql_table_prefix, $sph_messages, $type, $mark, $case_sensitive;
global $stem_words, $did_you_mean_enabled, $max_results, $include_dir, $vowels, $noacc_el;
$url = '';
$fulltxt = '';
$res = array();
$wildcount = substr_count($searchstr['+']['0'], '*');
if ($wildcount) { // **** for * wildcard , enter here
$searchstr['+']['0'] = str_replace('*','%', $searchstr['+']['0']);
}
if ($type == "tol" || $vowels == "1") {
$searchstr['+']['0'] = remove_acc($searchstr['+']['0'], '0');
}
if ($type == "tol" || $noacc_el == "1") {
$searchstr['+']['0'] = remove_acc_el($searchstr['+']['0'], '0');
}
$i = 1;
if ($type == "or") {
foreach ($searchstr['+'] as $query) {
if ($stem_words != 'none') {
$query = stem_word($query, $type);
}
$query1 = mysql_real_escape_string($query);
// build up the MySQL query for OR search
if ($i != '1' ) {
if ($case_sensitive == '1') {
$or_query .= " or title like '%$query1%' ";
}else {
$or_query .= " or CONVERT((title)USING utf8) like '%$query1%' ";
}
} else {
if ($case_sensitive == '1') {
$or_query .= " title like '%$query1%' ";
} else {
$or_query .= " CONVERT((title)USING utf8) like '%$query1%' ";
}
}
$i++;
}
$result = @mysql_query("SELECT link_id, url, title from ".$mysql_table_prefix."link_details where ".$or_query."");
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
//echo "\r\n\r\n<br /> OR num_rows: $num_rows<br />\r\n";
if ($num_rows == 0) {
$possible_to_find = '0';
}
}
if ($type == 'and' ) {
foreach ($searchstr['+'] as $query) {
$query1 = mysql_real_escape_string($query);
// build up the MySQL query for AND search
if ($i != '1' ) {
if ($case_sensitive == '1') {
$and_query .= " and title like '%$query1%' ";
} else {
$and_query .= " and CONVERT((title)USING utf8) like '%$query1%' ";
}
} else {
if ($case_sensitive == '1') {
$and_query .= " title like '%$query1%' ";
} else {
$and_query .= " CONVERT((title)USING utf8) like '%$query1%' ";
}
}
$i++;
}
$result = @mysql_query("SELECT link_id, url, title, domain from ".$mysql_table_prefix."link_details where ".$and_query."");
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
//echo "\r\n\r\n<br /> AND num_rows: $num_rows<br />\r\n";
if ($num_rows == 0) {
$possible_to_find = '0';
}
}
if ($type == "phrase" || $type == "tol" || $vowels == "1" || $noacc_el == "1" ) {
foreach ($searchstr['+'] as $query) {
$phrase .= $query." ";
if ($type == "tol" || $vowels == "1" ) {
$phrase = remove_acc($phrase, '0');
}
if ($type == "tol" || $noacc_el == "1" ) {
$phrase = remove_acc_el($phrase, '0');
}
}
$phrase1 = trim(mysql_real_escape_string($phrase));
$result = @mysql_query("SELECT link_id, url, title from ".$mysql_table_prefix."link_details where CONVERT((title)USING utf8) like '%$phrase1%'");
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
//echo "\r\n\r\n<br /> Phrase-Tol num_rows: $num_rows<br />\r\n";
if ($num_rows == 0) {
$possible_to_find = '0';
}
}
if ($possible_to_find == '1') {
if ($mark == 'markbold') {
$highlight = "span class=\"mak_1\"";
}
if ($mark == 'markblue') {
$highlight = "span class=\"mak_2\"";
}
if ($mark == 'markyellow') {
$highlight = "span class=\"mak_3\"";
}
if ($mark == 'markgreen') {
$highlight = "span class=\"mak_4\"";
}
if ($mark == 'markred') {
$highlight = "span class=\"mak_5\"";
}
$i = 0;
for ($i = 0; $i < $max_results && $row = mysql_fetch_array($result, MYSQL_NUM); $i++) {
$page_res = mysql_query("select * from ".$mysql_table_prefix."links where link_id like '$row[0]'");
if ($debug > '0') echo mysql_error();
$page_row = mysql_fetch_array($page_res);
$page_title = ($page_row[3]); // get title of page that contains this new result (link)
$title = " ".$row[2]." "; // free the title of this new result (link)
foreach($searchstr['hilight'] as $change) {
$title = highlight($title, $change, $highlight); // mark all searchwords found in this link text
}
// prepare this link-url for our click counter
$url_crypt = str_replace("&", "-_-", $row[1]); // crypt the & character
$url_click = "$include_dir/click_counter.php?url=$url_crypt&query=$query&db=$db_slv&prefix=$mysql_table_prefix"; // redirect users click in order to update Most Popular Links
$fulltxt = "<br />Link: <a href=\"".$url_click."\" target =top>".$title."</a><br /><br />";
// now build up the result array
$res[$i]['title'] = $page_row[3];
$res[$i]['url'] = $page_row[2];
$res[$i]['fulltxt'] = $fulltxt;
$res[$i]['size'] = $page_row[7];
$res[$i]['click_counter'] = $page_row[11];
$res[$i]['weight'] = "100";
$res[$i]['domain'] = $row[3];
$urlparts = parse_url($res[$i]['url']);
//$res[$i]['path'] = $urlparts['path']; // get full path
$res[$i]['path'] = preg_replace('/([^\/]+)$/i', "", $urlparts['path']); // get path without filename
$res[$i]['maxweight'] = "100";
$res[$i]['results'] = $num_rows;
$res[$i]['db'] = $db_slv; // all these results are from db (the currently active db)
}
if ($clear == 1) {
@mysql_free_result($page_res);
@mysql_free_result($result);
unset ($fulltxt, $title);
}
//echo "\r\n\r\n<br>res Array:<br><pre>";print_r($res);echo "</pre>";
return $res;
} else { // if nothing found, try 'Did you mean'
if ($possible_to_find == 0 && $did_you_mean_enabled == 1) {
reset ($searchstr['+']);
foreach ($searchstr['+'] as $word) {
$word2 = str_ireplace("Ã", "Ã ", addslashes("$word"));
$result = @mysql_query("select keyword from ".$mysql_table_prefix."keywords where soundex(keyword) = soundex('$word2%')");
$max_distance = 100;
$near_word ="";
while ($row=@mysql_fetch_row($result)) {
$distance = levenshtein($row[0], $word);
if ($distance < $max_distance && $distance <10) {
$max_distance = $distance;
$near_word = ($row[0]);
}
}
if ($clear == 1) @mysql_free_result($result);
if ($near_word != "" && $word != $near_word) {
$near_words[$word] = $near_word;
}
}
if ($wildcount == '0' && $near_words != "") { // No 'Did you mean' for wildcount search
$res['did_you_mean'] = $near_words;
return $res;
}
}
}
}
function search($searchstr, $category, $start, $per_page, $type, $domain, $prefix) {
global $mysql_table_prefix, $show_meta_description, $sort_results, $all_wild;
global $stem_words, $did_you_mean_enabled, $relevance, $query, $clear, $greek, $translit_el, $noacc_el;
global $wildcount, $case_sensitive, $debug, $use_cache, $max_ctresults, $dom_count, $out;
global $dbu_act, $db1_slv, $db2_slv, $db3_slv, $db4_slv, $db5_slv;
global $database1, $database2, $database3, $database4, $database5;
global $mysql_table_prefix1, $mysql_table_prefix2, $mysql_table_prefix3, $mysql_table_prefix4, $mysql_table_prefix5;
// collect results from all involved databases
$res = array();
// search for query input
$res = search_dbs($searchstr, $category, $start, $per_page, $type, $domain, $prefix, $res);
if ($res['did_you_mean']){
return $res;
}
if (count($res) == 0) {
return null;
}
$all = count($res);
if ($domain) {
$sort_results = '1'; // overwriite Admin settings, as for search in one domain, we need all results in relevance order
}
if ($sort_results != '3') {
usort($res, "cmp_weight"); // standard output sorted by relevance (weight)
}
//if (($sort_results == '4' && $domain_qry == "" ) || $sort_results == '3') { // output alla Google OR by domain name
if ($sort_results == '4' && $domain_qry == "" ) { // output alla Google
sort_with_domains($res);
} else {
if ($sort_results == '2') { // enter here if 'Main URLs' on top of listing
usort($res, "cmp_dom_dot"); // sort domains without dots on top
usort($res, "cmp_path_slash"); // sort minimal slashes on top
}
if ($sort_results == '5') { // enter here if 'Most Popular Click' on top of listing
sort_by_bestclick($res);
}
}
// limit number of results per domain if Admin defined
if ($dom_count && $sort_results == '3'){
$i = '0';
$known_domain = $res[0]['domain']; // first known domain
foreach($res as &$v) {
$domain = $v['domain']; // fetch actual domain from result array
if ($known_domain == $domain && $i < $dom_count) {
$dom_res[] = $v; // build new result array
$i++;
} else { // no more results from known domain or counter maximum reached
if ($known_domain != $domain) { // fetched another domain in result array
$known_domain = $domain;
$dom_res[] = $v; // add first result of new domain
$i = '1';
}
}
}
$res = $dom_res;
}
$results = count ($res); // total amount of results
// limit result count to limit of text-cache
if ($use_cache == '1') {
if($results > $max_ctresults) {
$results = $max_ctresults;
$res = array_slice($res, 0, $max_ctresults);
}
}
/*
* in case that full (all) text results should be stored in XML output file,
* uncomment next 3 rows and comment the row
* convert_xml($xml_result, 'text');
* in function 'get_text_results'
if ($out == 'xml') {
text_xml($res, count($res), $searchstr);
}
*/
// reduce results for one page in result listing
$offset = ($start-1)*$per_page;
$res = array_slice($res, $offset, $per_page);
$res['maxweight'] = $res[0]['maxweight'];
$res['results'] = $results;
$res['hilight'] = $searchstr['hilight'];
//echo "<br>res Array complete:<br><pre>";print_r($res);echo "</pre>";
return $res;
}
function search_dbs($searchstr, $category, $start, $per_page, $type, $domain, $prefix, $res) {
global $mysql_table_prefix, $show_meta_description, $sort_results;
global $stem_words, $did_you_mean_enabled, $relevance, $query, $clear, $max_results;
global $wildcount, $type, $case_sensitive, $debug, $debug_user, $use_cache, $max_ctresults;
global $dbu_act, $user_db, $db1_slv, $db2_slv, $db3_slv, $db4_slv, $db5_slv;
global $database1, $database2, $database3, $database4, $database5;
global $mysql_table_prefix1, $mysql_table_prefix2, $mysql_table_prefix3, $mysql_table_prefix4, $mysql_table_prefix5;
$yet_results = ""; // predefined: up to now no results were found
if ($db1_slv == 1 && !$user_db || $user_db == 1) { // as defined in Admin's Database Management settings or by user overwritten
$db_con = db1_connect() ;
$valid = '1';
if ($prefix > '0' ) { // if requested by the Search Form, we need to use the shifted table-suffix
$valid = '';
$result = mysql_query("SHOW TABLES");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows && $valid == ''; $i++) { // the shifted table-suffix is part of this database?
$valid = strstr(mysql_tablename($result, $i), $prefix); // will create a non-zero value for $valid
}
if ($clear == 1) @mysql_free_result($result);
if ($valid) {
$mysql_table_prefix = $prefix; // replace the tablesuffix
} else {
if ($debug_user == '1') {
echo "Table prefix '$prefix' does not exist in database 1 ";
die();
}
}
} else {
$mysql_table_prefix = $mysql_table_prefix1; // use default suffix for this db
}
if ($valid) { // for standard table-suffix, or if shifted suffix is valid for this db
$db_slv = '1'; // get results from this db
$res = slave_search ($searchstr, $category, $domain, $mysql_table_prefix, $start, $per_page, $db_slv, $type, $yet_results);
}
}
if ($db2_slv == 1 && !$user_db || $user_db == 2) {
$db_con = db2_connect() ;
$valid = '1';
if ($prefix > '0' ) {
$valid = '';
$result = mysql_query("SHOW TABLES");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows && $valid == ''; $i++) { // the shifted table-suffix is part of this database?
$valid = strstr(mysql_tablename($result, $i), $prefix); // will create a non-zero value for $valid
}
if ($clear == 1) @mysql_free_result($result);
if ($valid) {
$mysql_table_prefix = $prefix; // replace the tablesuffix
} else {
if ($debug_user == '1') {
echo "Table prefix '$prefix' does not exist in database 2 ";
die();
}
}
} else {
$mysql_table_prefix = $mysql_table_prefix2; // use default suffix for this db
}
if ($valid) {
$db_slv = '2'; // active db
if ($res) {
$yet_results = "1"; // if result (or 'did you mean') was aready found
}
$res2 = slave_search ($searchstr, $category, $domain, $mysql_table_prefix, $start, $per_page, $db_slv, $type, $yet_results);
$res = array_merge($res, $res2);
}
}
if ($db3_slv == 1 && !$user_db || $user_db == 3) {
$db_con = db3_connect() ;
$valid = '1';
if ($prefix > '0' ) {
$valid = '';
$result = mysql_query("SHOW TABLES");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows && $valid == ''; $i++) { // the shifted table-suffix is part of this database?
$valid = strstr(mysql_tablename($result, $i), $prefix); // will create a non-zero value for $valid
}
if ($clear == 1) @mysql_free_result($result);
if ($valid) {
$mysql_table_prefix = $prefix; // replace the tablesuffix
} else {
if ($debug_user == '1') {
echo "Table prefix '$prefix' does not exist in database 3 ";
die();
}
}
} else {
$mysql_table_prefix = $mysql_table_prefix3; // use default suffix for this db
}
if ($valid) {
$db_slv = '3'; // active db
if ($res) {
$yet_results = "1"; // if result (or 'did you mean') was aready found
}
$res3 = slave_search ($searchstr, $category, $domain, $mysql_table_prefix, $start, $per_page, $db_slv, $type, $yet_results);
$res = array_merge($res, $res3);
}
}
if ($db4_slv == 1 && !$user_db || $user_db == 4) {
$db_con = db4_connect() ;
$valid = '1';
if ($prefix > '0' ) {
$valid = '';
$result = mysql_query("SHOW TABLES");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows && $valid == ''; $i++) { // the shifted table-suffix is part of this database?
$valid = strstr(mysql_tablename($result, $i), $prefix); // will create a non-zero value for $valid
}
if ($clear == 1) @mysql_free_result($result);
if ($valid) {
$mysql_table_prefix = $prefix; // replace the tablesuffix
} else {
if ($debug_user == '1') {
echo "Table prefix '$prefix' does not exist in database 4 ";
die();
}
}
} else {
$mysql_table_prefix = $mysql_table_prefix4; // use default suffix for this db
}
if ($valid) {
$db_slv = '4'; // active db
if ($res) {
$yet_results = "1"; // if result (or 'did you mean') was aready found
}
$res4 = slave_search ($searchstr, $category, $domain, $mysql_table_prefix, $start, $per_page, $db_slv, $type, $yet_results);
$res = array_merge($res, $res4);
}
}
if ($db5_slv == 1 && !$user_db || $user_db == 5) {
$db_con = db5_connect() ;
$valid = '1';
if ($prefix > '0' ) {
$valid = '';
$result = mysql_query("SHOW TABLES");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows && $valid == ''; $i++) { // the shifted table-suffix is part of this database?
$valid = strstr(mysql_tablename($result, $i), $prefix); // will create a non-zero value for $valid
}
if ($clear == 1) @mysql_free_result($result);
if ($valid) {
$mysql_table_prefix = $prefix; // replace the tablesuffix
} else {
if ($debug_user == '1') {
echo "Table prefix '$prefix' does not exist in database 5 ";
die();
}
}
} else {
$mysql_table_prefix = $mysql_table_prefix5; // use default suffix for this db
}
if ($valid) {
$db_slv = '5'; // active db
if ($res) {
$yet_results = "1"; // if result (or 'did you mean') was aready found
}
$res5 = slave_search ($searchstr, $category, $domain, $mysql_table_prefix, $start, $per_page, $db_slv, $type, $yet_results);
$res = array_merge($res, $res5);
}
}
// re-activate database of actual 'Search User'
if ($dbu_act == '1') {
$db_con = db1_connect() ;
$success = @mysql_select_db ($database1, $db_con);
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix1;
}
}
if ($dbu_act == '2') {
$db_con = db2_connect() ;
$success = @mysql_select_db ($database2, $db_con);
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix2;
}
}
if ($dbu_act == '3') {
$db_con = db3_connect() ;
$success = @mysql_select_db ($database3, $db_con);
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix3;
}
}
if ($dbu_act == '4') {
$db_con = db4_connect() ;
$success = @mysql_select_db ($database4, $db_con);
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix4;
}
}
if ($dbu_act == '5') {
$db_con = db5_connect() ;
$success = @mysql_select_db ($database5, $db_con);
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix5;
}
}
$res = array_slice($res, 0, $max_results, TRUE);
return $res;
}
function slave_search($searchstr, $category, $domain, $mysql_table_prefix, $start, $per_page, $db_slv, $type, $yet_results) {
global $show_meta_description, $sort_results, $stem_words, $did_you_mean_enabled, $relevance, $index_meta_description;
global $wildcount, $case_sensitive, $debug, $max_results, $clear, $only_links, $vowels, $noacc_el, $translit_el, $mb ;
$possible_to_find = 1;
$result = @mysql_query("select domain_id from ".$mysql_table_prefix."domains where domain = '$domain'");
if (@mysql_num_rows($result)> 0) {
$thisrow = @mysql_fetch_array($result);
$domain_qry = "and domain = ".$thisrow[0];
} else {
$domain_qry = "";
}
if ($clear == 1) @mysql_free_result($result);
$notlist = array();
//find all sites that should not be included in the result
if (count($searchstr['+']) == 0) {
return $notlist;
}
$wordarray = $searchstr['-'];
$not_words = 0;
while ($not_words < count($wordarray)) {
if ($stem_words != 'none') {
$searchword = addslashes(stem_word($wordarray[$not_words], $type));
} else {
$searchword = addslashes($wordarray[$not_words]);
}
$wordmd5 = substr(md5($searchword), 0, 1);
$query1 = "SELECT link_id from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword'";
$result = @mysql_query($query1);
while ($row = @mysql_fetch_row($result)) {
$notlist[$not_words]['id'][$row[0]] = 1;
}
$not_words++;
if ($clear == 1) @mysql_free_result($result);
}
//echo "\r\n\r\n<br>searchstr Array:<br><pre>";print_r($searchstr);echo "</pre>\r\n";
//find all sites containing the search PHRASE
$wordarray = $searchstr['+s'];;
$phrase_words = 0;
$phraselist = '';
if ($type == "phrase") {
while ($phrase_words < count($wordarray)) {
$searchword = addslashes($wordarray[$phrase_words]);
$phrase_query = $searchword; // remember this for highlighting
//echo "\r\n\r\n<br /> PHRASE searchword: $searchword<br />\r\n";
if ($vowels) { // replace Latin vowels with wildcard letters
$searchword = rep_latvowels(remove_acc($searchword, '0'));
}
/*
if ($translit_el) { // translit to Greek letters
$searchword = translit_el($searchword);
}
*/
if ($noacc_el) { // replace Greek vowels with wildcard letters
$searchword = rep_elvowels(remove_acc_el($searchword, '0'));
}
// search for phrase in fulltext
if ($case_sensitive =='1') {
$query1 = "SELECT link_id from ".$mysql_table_prefix."links where fulltxt like '%$searchword%'";
} else {
$query1 = "SELECT link_id from ".$mysql_table_prefix."links where CONVERT(LOWER(fulltxt)USING utf8) like '%$searchword%'";
}
$result = @mysql_query($query1);
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
//echo "\r\n\r\n<br /> num_rows: $num_rows<br />\r\n";
if ($num_rows == 0 && !$only_links) {
// phrase not found in fulltext. Now try to find in title tag. But not for 'only link search'
if ($case_sensitive =='1') {
$query1 = "SELECT link_id from ".$mysql_table_prefix."links where title like '%$searchword%'";
}
if ($case_sensitive =='0') {
$searchword = lower_case($searchword);
$query1 = "SELECT link_id from ".$mysql_table_prefix."links where CONVERT(LOWER(title)USING utf8) like '%$searchword%'";
}
$result = @mysql_query($query1);
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
if ($num_rows == 0 && $index_meta_description == 1) {
// phrase not found in title tag . Now try to find in dexcription tag.
if ($case_sensitive =='1') {
$query1 = "SELECT link_id from ".$mysql_table_prefix."links where description like '%$searchword%'";
}
if ($case_sensitive =='0') {
$searchword = lower_case($searchword);
$query1 = "SELECT link_id from ".$mysql_table_prefix."links where CONVERT(LOWER(description)USING utf8) like '%$searchword%'";
}
$result = @mysql_query($query1);
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
}
if ($num_rows == 0) {
$possible_to_find = 0;
break;
}
}
while ($row = @mysql_fetch_row($result)) {
$value =$row[0];
$phraselist[$phrase_words]['id'][$row[0]] = 1;
$phraselist[$phrase_words]['val'][$row[0]] = $value;
}
$phrase_words++;
}
}
//echo "\r\n\r\n<br>phraselist:<br><pre>";print_r($phraselist);echo "</pre>\r\n";
if (($category> 0) && $possible_to_find==1) {
$allcats = get_cats($category);
$catlist = implode(",", $allcats);
$query1 = "select link_id from ".$mysql_table_prefix."links, ".$mysql_table_prefix."sites, ".$mysql_table_prefix."categories, ".$mysql_table_prefix."site_category where ".$mysql_table_prefix."links.site_id = ".$mysql_table_prefix."sites.site_id and ".$mysql_table_prefix."sites.site_id = ".$mysql_table_prefix."site_category.site_id and ".$mysql_table_prefix."site_category.category_id in ($catlist)";
$result = @mysql_query($query1);
if ($debug > '0') echo mysql_error();
$num_rows = @mysql_num_rows($result);
if ($num_rows == 0) {
$possible_to_find = 0;
}
while ($row = @mysql_fetch_row($result)) {
$category_list[$row[0]] = 1;
}
}
if ($clear == 1) @mysql_free_result($result);
// if selected, search only links as full text and present them
if ($only_links) {
$res = links_only($searchstr, $type, $possible_to_find, $db_slv);
return $res;
}
$wordarray = $searchstr['+'];
$words = 0;
$searchword = addslashes($wordarray[$words]); // get only first word of search query
$strictpos = strpos($searchword, '!'); // if ! is in position 0, we have to search strict
if ($strictpos === 0) { // **** for 'Strict search' enter here
$searchword = str_replace('!', '', $searchword); // remove the strict directive from query
//echo "\r\n\r\n<br /> STRICT searchword: $searchword<br />\r\n";
$query = "SELECT keyword_id, keyword from ".$mysql_table_prefix."keywords where keyword = '$searchword'";
if ($debug > '0') echo mysql_error();
$result = @mysql_query($query);
$num_rows = @mysql_num_rows($result);
if ($num_rows == 0) { // if there was no searchword in table keywords
$possible_to_find = 0;
$break = 1;
}
if ($num_rows !=0) {
// get all searchwords as keywords from table keywords
$keyword_id = @mysql_result($result, $i, "keyword_id");
$keyword = @mysql_result($result, $i, "keyword");
$keyword = str_replace("'", "\\'", $keyword); // replace backslash as during index created for MySQL database required
$wordmd5 = substr(md5($keyword), 0, 1); // calculate attribute for link_keyword table
if ($clear == 1) @mysql_free_result($result);
if ($sort_results == '7') { // get query hit results
$query1 = "SELECT distinct link_id, hits, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword' $domain_qry order by hits desc";
} else { // get weight results
$query1 = "SELECT link_id, weight, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5 where keyword_id = '$keyword_id' order by weight desc";
}
if ($debug > '0') echo mysql_error();
$reso = @mysql_query($query1);
$lines = @mysql_num_rows($reso);
if ($lines != 0) {
$indx =$words;
}
while ($row = @mysql_fetch_row($reso)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
if ($sort_results == '6') {
$linklist[$indx]['weight'][$row[0]] = $row[3]; // use indexdate
} else {
$linklist[$indx]['weight'][$row[0]] = $row[1]; // use weight
}
if ($sort_results == '7') { // ensure that result is also available in full text
$txt_res = @mysql_query("SELECT fulltxt FROM ".$mysql_table_prefix."links where link_id = '$row[0]'");
if ($debug > '0') echo mysql_error();
$full_txt = @mysql_result($txt_res, 0); // get fulltxt of this link ID
if ($case_sensitive == '0') {
$full_txt= lower_ent($full_txt);
$full_txt = lower_case($full_txt);
}
$foundit = strpos($full_txt, $searchword); // get first hit
if ($foundit) {
$page_hits = $linklist[$indx]['weight'][$row[0]] ;
$i = '0';
while ($i < $page_hits) { // find out if all results in full text are really strict
$found_in = strpos($full_txt, $searchword);
$tmp_front = substr($full_txt, $found_in-1, 20); // one character before found match position
$pos = $found_in+strlen($searchword);
$tmp_behind = substr($full_txt, $pos, 20); // one character behind found match position
$full_txt = substr($full_txt, $pos); // get rest of fulltxt
// check whether found match is realy strict
$found_before = preg_match("/[(a-z)-_*.\/\:&@\w]/", substr($tmp_front, 0, 1));
$found_behind = preg_match("/[(a-z)-_*.,\/\:&@\w]/", substr($tmp_behind, 0, 1));
if ($found_before == 1 || $found_behind == 1) { // correct count of hits
$linklist[$indx]['weight'][$row[0]] = $linklist[$indx]['weight'][$row[0]] - 1;
}
$i++;
}
} else {
$linklist[$indx]['weight'][$row[0]] = '0'; // nothing found in full text. Hits = 0
}
}
}
$words++;
if ($clear == 1) @mysql_free_result($reso);;
//echo "\r\n\r\n<br>linklist Array:<br><pre>";print_r($linklist);echo "</pre>\r\n";
}
} else { //**** if not strict-search try here
$wild_correct = 0;
$wildcount = substr_count($searchword, '*');
if ($wildcount) { // **** for * wildcard , enter here
$searchword = str_replace('*','%', $searchword);
$words = '0';
//echo "\r\n\r\n<br /> WILDCARD searchword: $searchword<br />\r\n";
$query = "SELECT keyword_id, keyword from ".$mysql_table_prefix."keywords where keyword like '$searchword'";
if ($debug > '0') echo mysql_error();
$result = @mysql_query($query);
$num_rows = @mysql_num_rows($result);
if ($num_rows == 0) { // if there was no searchword in table keywords
$possible_to_find = 0;
$break = 1;
}
if ($num_rows !=0) {
global $all_wild;
$all_wild = '';
for ($i=0; $i<$num_rows; $i++) { // get all searchwords as keywords from table keywords
$keyword_id = @mysql_result($result, $i, "keyword_id");
$keyword = @mysql_result($result, $i, "keyword");
$all_wild =("$all_wild $keyword");
$wordmd5 = substr(md5(addslashes($keyword)), 0, 1); // calculate attribute for link_keyword table
if ($sort_results == '7') { // get query hit results
$query1 = "SELECT link_id, hits, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5 where keyword_id = '$keyword_id' order by hits desc";
} else { // get weight results
$query1 = "SELECT link_id, weight, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5 where keyword_id = '$keyword_id' order by weight desc";
}
if ($debug > '0') echo mysql_error();
$reso = @mysql_query($query1);
$lines = @mysql_num_rows($reso);
if ($lines == 0) {
if ($type != "or") {
$possible_to_find = 0;
break;
}
}
if ($type == "or" && $sort_results == '7') {
$indx = 0;
} else {
$indx = $words;
}
while ($row = @mysql_fetch_row($reso)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
if ($sort_results == '6') {
$linklist[$indx]['weight'][$row[0]] = $row[3]; // use indexdate
} else {
$linklist[$indx]['weight'][$row[0]] = $row[1]; // use weight
}
if ($sort_results == '7') { // ensure that result is also available in fulltxt
$searchword =str_replace("%", '', $searchword);
$txt_res = @mysql_query("SELECT fulltxt FROM ".$mysql_table_prefix."links where link_id = '$row[0]'");
if ($debug > '0') echo mysql_error();
$full_txt = @mysql_result($txt_res, 0); // get fulltxt of this link ID
if ($case_sensitive == '0') {
$full_txt= lower_ent($full_txt);
$full_txt = lower_case($full_txt);
}
$pureword = str_replace('%','', $searchword);
$foundit = substr_count($full_txt, $pureword);
$linklist[$indx]['weight'][$row[0]] = $foundit; // count of hits
if (!$foundit) {
$linklist[$indx]['weight'][$row[0]] = '0'; // nothing found in full text. Hits = 0
}
}
}
}
$words++;
if ($clear == 1) @mysql_free_result($reso);
}
if ($clear == 1) @mysql_free_result($result);
} else { // if no wildcard, try here
if ($type == 'tol') { // ***** if tolerant search: enter here
$searchword = remove_acc($searchword, '0');
if ($noacc_el) {
$searchword = remove_acc_el($searchword, '0');
}
//echo "\r\n\r\n<br /> TOLERANT searchword: $searchword<br />\r\n";
$query = "SELECT keyword_id, keyword from ".$mysql_table_prefix."keywords where keyword like '$searchword'";
if ($debug > '0') echo mysql_error();
$result = @mysql_query($query);
$num_rows = @mysql_num_rows($result);
if ($num_rows == 0) { // if there was no searchword in table keywords
$possible_to_find = 0;
$break = 1;
}
if ($num_rows !=0) {
global $all_wild;
$all_wild = '';
for ($i=0; $i<$num_rows; $i++) { // get all searchwords as keywords from table keywords
$keyword_id = @mysql_result($result, $i, "keyword_id");
$keyword = @mysql_result($result, $i, "keyword");
$accept = '1';
// hopefully the PHP multibyte extention is available; otherwise use all results
if (function_exists(mb_strlen)) {
if (mb_strlen($keyword) != mb_strlen($searchword)){ // use only those results with same length as searchword
$accept = '0';
}
}
if ($accept == '1') {
$all_wild =("$all_wild $keyword");
$wordmd5 = substr(md5($keyword), 0, 1); // calculate attribute for link_keyword table
if ($sort_results == '7') { // get query hit results
$query1 = "SELECT link_id, hits, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5 where keyword_id = '$keyword_id' order by hits desc";
} else { // get weight results
$query1 = "SELECT link_id, weight, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5 where keyword_id = '$keyword_id' order by weight desc";
}
if ($debug > '0') echo mysql_error();
$reso = @mysql_query($query1);
$lines = @mysql_num_rows($reso);
if ($lines != 0) {
$indx =$words;
}
while ($row = @mysql_fetch_row($reso)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
if ($sort_results == '6') {
$linklist[$indx]['weight'][$row[0]] = $row[3]; // use indexdate
} else {
$linklist[$indx]['weight'][$row[0]] = $row[1]; // use weight
}
}
//$words++;
}
}
$words++;
if ($clear == 1) @mysql_free_result($reso);
}
if ($clear == 1) @mysql_free_result($result);
} else { // ******* finally standard search
$words = 0;
while (($words < count($wordarray)) && $possible_to_find == 1) {
if ($stem_words != 'none') {
$searchword = addslashes(stem_word($wordarray[$words], $type));
} else {
$searchword = addslashes($wordarray[$words]);
}
$wordmd5 = substr(md5($searchword), 0, 1);
if ($sort_results == '7') { // get query hit results
$query1 = "SELECT distinct link_id, hits, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword' $domain_qry order by hits desc";
} else { // get weight results
$query1 = "SELECT distinct link_id, weight, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword' $domain_qry order by weight desc";
}
if ($debug > '0') echo mysql_error();
$result = @mysql_query($query1);
$num_rows = @mysql_num_rows($result);
if ($type == "or" && $sort_results == '7') {
$indx = 0;
} else {
$indx = $words;
}
while ($row = @mysql_fetch_row($result)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
if ($sort_results == '6') { // 6 = sort results 'By index date'
$linklist[$indx]['weight'][$row[0]] = $row[3]; // use indexdate
} else {
$linklist[$indx]['weight'][$row[0]] = $row[1]; // use weight
}
if ($sort_results == '7') { // 7= sort results 'By hit counts in full text' => ensure that result is also available in fulltxt
if ($type == 'phrase') {
$searchword = $phrase_query;
}
$linklist[$indx]['weight'][$row[0]] = '0';
$txt_res = @mysql_query("SELECT fulltxt FROM ".$mysql_table_prefix."links where link_id = '$row[0]'");
if ($debug > '0') echo mysql_error();
$full_txt = @mysql_result($txt_res, 0); // get fulltxt of this link ID
if ($case_sensitive == '0') {
$full_txt = lower_case($full_txt);
}
if ($vowels) { // replace Latin accents with their vowels
$full_txt = remove_acc($full_txt, '0');
}
if ($noacc_el) { // replace Greek accents with their vowels
$full_txt = remove_acc_el($full_txt, '0');
}
if (substr_count($full_txt, $searchword)) { // found searchword in full text?
$linklist[$indx]['weight'][$row[0]] = substr_count($full_txt, $searchword); // number of hits found in this full text
}
}
}
$words++;
if ($clear == 1) @mysql_free_result($result);
}
if ($translit_el) { // eventually we need to add links that are found after transliterating the query
$words = 0;
while (($words < count($wordarray)) && $possible_to_find == 1) {
if ($stem_words != 'none') {
$searchword = addslashes(stem_word($wordarray[$words], $type));
} else {
$searchword = addslashes($wordarray[$words]);
}
$el_searchword = translit_el($searchword);
$wordmd5 = substr(md5($el_searchword), 0, 1);
if ($sort_results == '7') { // get query hit results
$query1 = "SELECT distinct link_id, hits, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$el_searchword' $domain_qry order by hits desc";
} else { // get weight results
$query1 = "SELECT distinct link_id, weight, domain, indexdate from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$el_searchword' $domain_qry order by weight desc";
}
if ($debug > '0') echo mysql_error();
$el_result = @mysql_query($query1);
$el_rows = @mysql_num_rows($el_result);
if ($type == "or" && $sort_results == '7') {
$indx = 0;
} else {
$indx = $words;
}
while ($row = @mysql_fetch_row($el_result)) {
$new_id = $row[0];
// if not yet known link_id, add new link
if (!in_array($new_id, $linklist[0]['id'])){
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
if ($sort_results == '6') { // 6 = sort results 'By index date'
$linklist[$indx]['weight'][$row[0]] = $row[3]; // use indexdate
} else {
$linklist[$indx]['weight'][$row[0]] = $row[1]; // use weight
}
if ($sort_results == '7') { // 7= sort results 'By hit counts in full text' => ensure that result is also available in fulltxt
if ($type == 'phrase') {
$searchword = $phrase_query;
}
$linklist[$indx]['weight'][$row[0]] = '0';
$txt_res = @mysql_query("SELECT fulltxt FROM ".$mysql_table_prefix."links where link_id = '$row[0]'");
if ($debug > '0') echo mysql_error();
$full_txt = @mysql_result($txt_res, 0); // get fulltxt of this link ID
if ($case_sensitive == '0') {
$full_txt = lower_case($full_txt);
}
if ($vowels) { // replace Latin accents with their vowels
$full_txt = remove_acc($full_txt, '0');
}
if ($noacc_el) { // replace Greek accents with their vowels
$full_txt = remove_acc_el($full_txt, '0');
}
if (substr_count($full_txt, $searchword)) { // found searchword in full text?
$linklist[$indx]['weight'][$row[0]] = substr_count($full_txt, $searchword); // number of hits found in this full text
}
}
}
}
$words++;
if ($clear == 1) @mysql_free_result($result);
}
}
if ($translit_el) {
if ($el_rows < "1" && $num_rows < "1") {
if ($type != "or") {
$possible_to_find = 0; // nothing found
}
}
} else {
if ($num_rows < "1") {
if ($type != "or") {
$possible_to_find = 0; // nothing found
}
}
}
}
}
} // ***** end different search modes
if ($type == "or") {
$words = 1;
}
//echo "<br>linklist Array:<br><pre>";print_r($linklist);echo "</pre>";
$result_array_full = array();
if ($words == 1 && $not_words == 0 && $category < 1 && $type !="phrase") { // for OR-Sarch without query_hits and one word query, we already do have the result
$result_array_full = $linklist[0]['weight'];
} else { // otherwise build an intersection of all the results
$j= 1;
$min = 0;
while ($j < $words) {
if (count($linklist[$min]['id']) > count($linklist[$j]['id'])) {
$min = $j;
}
$j++;
}
$j = 0;
$temp_array = $linklist[$min]['id'];
$count = 0;
while ($j < count($temp_array)) {
$k = 0; //AND word counter
$n = 0; //NOT word counter
$o = 0; //PHRASE word counter
if ($sort_results == '7') {
$weight = 0;
} else {
$weight = 1;
}
$break = 0;
if ($type =='phrase' && $sort_results == '7') { // for PHRASE search: find out how often the phrase was found in fulltxt (not for weighting % scores)
while ($k < $words && $break== 0) {
if ($linklist[$k]['weight'][$temp_array[$j]] > 0) {
$weight = $linklist[$k]['weight'][$temp_array[$j]];
} else {
$break = 1;
}
$k++;
}
} else {
while ($k < $words && $break== 0) {
if ($linklist[$k]['weight'][$temp_array[$j]] > 0) {
if ($sort_results == '6' || $sort_results == '3') {
$weight = $linklist[$k]['weight'][$temp_array[$j]]; // use indexdate
} else {
$weight = $weight + $linklist[$k]['weight'][$temp_array[$j]]; // calculate weight
}
} else {
$break = 1;
}
$k++;
}
}
while ($n < $not_words && $break== 0) {
if ($notlist[$n]['id'][$temp_array[$j]] > 0) {
$break = 1;
}
$n++;
}
while ($o < $phrase_words && $break== 0) {
if ($phraselist[$o]['id'][$temp_array[$j]] != 1) {
$break = 1;
}
$o++;
}
if ($break== 0 && $category > 0 && $category_list[$temp_array[$j]] != 1) {
$break = 1;
}
if ($break == 0) {
$result_array_full[$temp_array[$j]] = $weight;
$count ++;
}
$j++;
}
}
//echo "\r\n\r\n<br>result_array_full Array1:<br><pre>";print_r($result_array_full);echo "</pre>\r\n";
// verify all PHRASE results and kill invalid links
if ($type == "phrase") {
$ph_query = $phrase_query;
$phrase_ok = array();
$found = '';
foreach ($result_array_full as $key => $value) {
$query01= "SELECT distinct title, description, fulltxt FROM ".$mysql_table_prefix."links WHERE link_id in ($key)";
$result = @mysql_query($query01);
$row = @mysql_fetch_row($result);
$fulltxt = $row['2'];
$description = $row['1'];
$title = $row['0'];
if ($mb) {
if ($case_sensitive !='1') {
$ph_query = mb_strtolower($ph_query);
$fulltxt = mb_strtolower($fulltxt);
$title = mb_strtolower($title);
$description = mb_strtolower($description);
}
} else {
if ($case_sensitive !='1') {
$ph_query = lower_ent($ph_query);
$ph_query = lower_case($ph_query);
$fulltxt = lower_ent($fulltxt);
$fulltxt = lower_case($fulltxt);
$title = lower_ent($title);
$title = lower_case($title);
$description = lower_ent($description);
$description = lower_case($description);
}
}
if ($vowels) { // replace Latin vowels with wildcard letters
//$ph_query = remove_acc($ph_query);
$fulltxt = remove_acc($fulltxt, '0');
$title = remove_acc($title, '0');
$description = remove_acc($description, '0');
}
/*
if ($translit_el) { // translit to Greek letters
//$ph_query = translit_el($ph_query);
$fulltxt = translit_el($fulltxt);
$title = translit_el($title);
$description = translit_el($description);
}
*/
if ($noacc_el) { // replace Greek vowels with wildcard letters
//$ph_query = remove_acc_el($ph_query);
$fulltxt = remove_acc_el($fulltxt, '0');
$title = remove_acc_el($title, '0');
$description = remove_acc_el($description, '0');
}
// if search-phrase was found in fulltext, title or description tag
if ($mb) {
if (mb_strstr($fulltxt, $ph_query) || mb_strstr($title, $ph_query) || ($index_meta_description && mb_strstr($description, $ph_query))) {
$phrase_ok[$key] = $value;
}
} else {
if (strstr($fulltxt, $ph_query) || strstr($title, $ph_query) || ($index_meta_description && strstr($description, $ph_query))) {
$phrase_ok[$key] = $value;
}
}
}
$result_array_full = $phrase_ok;
}
if ($clear == 1) {
$temp_array = array();
$linklist = array();
}
//word == 1
if ((count($result_array_full) == 0 || $possible_to_find == 0) && $did_you_mean_enabled == 1) {
reset ($searchstr['+']);
foreach ($searchstr['+'] as $word) {
$word2 = str_ireplace("Ã", "Ã ", addslashes("$word"));
$max_distance = 100;
$near_word ="";
// first try to find any keywords using the soundex algorithm
$result = @mysql_query("select keyword from ".$mysql_table_prefix."keywords where soundex(keyword) = soundex('$word2%')");
if (!@mysql_num_rows($result)) {
// if no match with first trial, try to find keywords with additional characters at the end
$result = @mysql_query("select keyword from ".$mysql_table_prefix."keywords where keyword like '$word2%'");
}
while ($row=@mysql_fetch_row($result)) {
$distance = levenshtein($row[0], $word);
if ($distance < $max_distance && $distance <10) {
$max_distance = $distance;
$near_word = ($row[0]);
}
}
if ($clear == 1) @mysql_free_result($result);
if ($near_word != "" && $word != $near_word) {
$near_words[$word] = $near_word;
}
}
if ($wildcount == '0' && $near_words != "" && !$yet_results) { // No 'Did you mean' for wildcount search, and if not yet results were found
$res['did_you_mean'] = $near_words;
return $res;
}
}
// limit amount of results in result listing
$result_array_full = array_slice($result_array_full, 0, $max_results, TRUE);
//return $result_array_full;
if (count($result_array_full) == 0) {
$result_array_full = array();
return $result_array_full; // return blank array, otherwise array_merge() will not work in PHP5
}
if ($result_array_full['did_you_mean'] && !$yet_results){
return $result_array_full;
}
arsort ($result_array_full);
if ($sort_results == 4 && $domain_qry == "") { // output alla Google)
while (list($key, $value) = each($result_array_full)) {
if (!isset($domains_to_show[$domains[$key]])) {
$result_array_temp[$key] = $value;
$domains_to_show[$domains[$key]] = 1;
} else if ($domains_to_show[$domains[$key]] == 1) {
$domains_to_show[$domains[$key]] = Array ($key => $value);
}
}
} else {
$result_array_temp = $result_array_full;
}
if ($clear == 1) $result_array_full = array();
while (list($key, $value) = each ($result_array_temp)) {
$result_array[$key] = $value;
if (isset ($domains_to_show[$domains[$key]]) && $domains_to_show[$domains[$key]] != 1) {
list ($k, $v) = each($domains_to_show[$domains[$key]]);
$result_array[$k] = $v;
}
}
if ($clear == 1) $result_array_temp = array();
$keys = array_keys($result_array);
$maxweight = $result_array[$keys[0]];
$count = '0';
//echo "\r\n\r\n<br>result Array:<br><pre>";print_r($result_array);echo "</pre>\r\n";
foreach ($result_array as $row) {
$weight = $row;
if ($sort_results != '6') { // limit result output to min. relevance level or hits in full text
if ($sort_results != '7') { // no weight calculation for hits in full text
$weight = number_format($row/$maxweight*100, 0);
if ($weight >= $relevance) {
$count = ($count+1) ;
}
} else {
if ($row >= $relevance && $row > 0) { // present results only if relevance is met AND hits in full text are available
$count = ($count+1) ;
}
}
} else {
$count = ($count+1) ;
}
}
if ($count != '0') {
$result_array = array_chunk($result_array, $count, true); // limit result output(weight > relevance level OR hits in fulltext > 0)
}
$result_array = $result_array[0];
$results = count($result_array);
for ($i = 0; $i <min($results, ($start -1)* $max_results+ $max_results) ; $i++) {
$in[] = $keys[$i];
}
if (!is_array($in)) {
$res['results'] = $results;
if ($clear == 1){
unset ($results);
$result_array = array();
$in = array();
$keys = array();
}
return $res;
}
$inlist = implode(",", $in);
$query1 = "SELECT distinct link_id, url, title, description, fulltxt, size, click_counter FROM ".$mysql_table_prefix."links WHERE link_id in ($inlist)";
$result = @mysql_query($query1);
if ($debug > '0') echo mysql_error();
$i = 0;
while ($row = @mysql_fetch_row($result)) {
//echo "\r\n\r\n<br /> full_text:<br />\r\n$all_text\r\n<br />\r\n";
$res[$i]['title'] = $row[2];
$res[$i]['url'] = $row[1];
if ($row[3] != null && $show_meta_description == 1)
$res[$i]['fulltxt'] = $row[3];
else
$res[$i]['fulltxt'] = $row[4];
$res[$i]['size'] = $row[5];
$res[$i]['click_counter'] = $row[6];
$res[$i]['weight'] = $result_array[$row[0]];
$dom_result = @mysql_query("select domain from ".$mysql_table_prefix."domains where domain_id='".$domains[$row[0]]."'");
if ($debug > '0') echo mysql_error();
$dom_row = @mysql_fetch_row($dom_result);
$res[$i]['domain'] = $dom_row[0];
$urlparts = parse_url($res[$i]['url']);
//$res[$i]['path'] = $urlparts['path']; // get full path
$res[$i]['path'] = preg_replace('/([^\/]+)$/i', "", $urlparts['path']); // get path without filename
$res[$i]['maxweight'] = $maxweight;
$res[$i]['results'] = $count;
$res[$i]['db'] = $db_slv; // all these results are from db (the currently active db)
$i++;
}
if ($clear == 1) {
@mysql_free_result($result);
unset ($results, $inlist);
$result_array = array();
$in = array();
$keys = array();
}
//echo "\r\n\r\n<br>res array end of 'slave_search':<br><pre>";print_r($res);echo "</pre>";
return $res;
}
function get_text_results($query, $start, $category, $searchtype, $results, $domain, $loop, $orig_query, $prefix) {
global $sph_messages, $results_per_page, $all_wild, $show_meta_description, $title_length;
global $links_to_next, $wildsearch, $show_warning, $mark, $type, $home_charset, $sort_results;
global $show_query_scores, $index_host, $url_length, $max_hits, $clear, $mb, $only_links;
global $mysql_table_prefix, $desc_length, $case_sensitive, $debug, $debug_user, $charSet, $greek, $translit_el;
global $use_cache, $textcache_dir, $tcache_size, $max_ctresults, $cn_seg, $dbu_act, $out, $xml_dir, $xml_name;
global $most_pop, $pop_rows, $tag_cloud, $color_cloud, $template_dir, $catid, $db, $add_url;
global $db1_slv, $db2_slv, $db3_slv, $db4_slv, $db5_slv, $one_word, $mustbe_and, $nostalgic_phrase, $vowels, $noacc_el;
global $type_rem, $result_rem, $mark_rem, $sort_rem, $catid_rem, $cat_rem, $from, $to, $show_sort, $include_dir;
mb_internal_encoding("UTF-8");
$full_result = array();
$xml_result = array();
$starttime = getmicrotime();
$query1 = $query;
$type = $searchtype;
$strictsearch = '';
$strictpos = strpos($query, '!');
if ($strictpos === 0) {
$strictsearch = '1';
}
if ($start==0)
$start=1;
if ($results != "") {
$results_per_page = $results;
}
if ($searchtype == "phrase") {
$query=str_replace('"','',$query);
$query = "\"".$query."\"";
}
// catch " if only entered once
if (substr_count($query,'\"')==1){
$query=str_replace('\"','',$query);
}
if ($case_sensitive == 0 && $searchtype != "phrase") {
$query = lower_ent($query);
$query = lower_case($query);
}
$words = makeboollist($query, $type);
$ignorewords = $words['ignore'];
if (is_array($ignorewords)) {
$full_result['ignore_words'] = $words['ignore'];
}
if ($query == 'pjswuc4290p') {
$query = mk5($query);
}
// if cached results should be used
$cache_query = str_replace('"', '', $query);
if (!$domain && $use_cache == '1' && !preg_match("/!|\/|\*|\~|#|%|<|>|\(|\)|{|}|\[|\]|\^|\\\/", $cache_query)) {
$cache_ok = '1';
if (!is_dir($textcache_dir)) {
mkdir($textcache_dir, 0777); // if not exist, try to create folder for text cache
if (!is_dir($textcache_dir)) {
echo "<br />Unable to create folder for text cache<br />";
$cache_ok = '';
}
}
$no_cache = '1';
if (is_dir($textcache_dir)) {
$rd_handle = @fopen("".$textcache_dir."/".$cache_query."_".$type."_".$category.".txt", "r+b");
if ($rd_handle) {
$cache_result = file_get_contents("".$textcache_dir."/".$cache_query."_".$type."_".$category.".txt");
if ($cache_result) {
$no_cache = '';
if ($debug_user == '1') {
echo "<small>Results found in cache.</small><br />";
}
// update cache-file with new modified date and time
file_put_contents("".$textcache_dir."/".$cache_query."_".$type."_".$category.".txt", $cache_result);
// make file content readable for result listing
$result = unserialize($cache_result);
// build result listing for one result page
if ($start == '1') {
$from = '0';
} else {
$from = ($start-1) * $results_per_page;
}
$count = count($result);
$int = array_slice($result, $count-3, '3');
$result = array_merge(array_slice($result, $from, $results_per_page), $int);
if ($clear == 1) $int = array();
}
}
@fclose($rd_handle);
}
// get fresh results . No cache entry for this query available
if ($no_cache == '1') {
if ($debug_user == '1') {
echo "<small>No results found in cache.<br />Get fresh result from database.</small><br />";
}
$c_start = '1'; // cache needs all results, starting with the first
$result = search($words, $category, $c_start, $max_ctresults, $searchtype, $domain, $prefix);
}
if ($cache_ok == '1' && $no_cache == '1' && $result[0][url]) { // create new cache file for new query input
$wr_handle = @fopen ("".$textcache_dir."/".$cache_query."_".$type."_".$category.".txt", "r");
if (!$wr_handle) { // create new cache file for current query input
$result_string = serialize($result);
if ($debug_user == '1') {
echo "<small>Create new result file for cache.</small><br />";
}
$new_handle = @fopen("".$textcache_dir."/".$cache_query."_".$type."_".$category.".txt", "wb");
if (!fwrite($new_handle, $result_string)) {
echo "<br />Unable to write into text cache<br />";
}
@fclose($new_handle);
} else {
@fclose($wr_handle);
}
// get total size and time of creation for each cache file
$size = '0';
$all = array();
$all_keys = array();
$all_vals = array();
if ($handle = opendir($textcache_dir)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$size = $size + (filesize("".$textcache_dir."/".$file.""));
$created = filemtime("".$textcache_dir."/".$file."");
$all_vals[] = $file;
$all_keys[] = $created;
}
}
}
$cache_size = $tcache_size * 1048576; // cache size in Byte
if ($size > $cache_size) {
$all = array_combine($all_keys, $all_vals);
ksort($all); // find oldest cache file
$del = current($all);
if ($debug_user == '1') {
echo "<small>Cache overflow. Delete least significant file in cache ($del)</small><br />";
}
@unlink("".$textcache_dir."/".$del.""); // delete oldest cache file
}
closedir($handle);
}
} else {
// get fresh results without cache
$result = search($words, $category, $start, $results_per_page, $searchtype, $domain, $prefix);
}
//echo "\r\n\r\n<br>result Array:<br><pre>";print_r($result);echo "</pre>\r\n";
$query = stripslashes($query);
$num_of_results = '0';
$did_you_mean = "";
$entitiesQuery = htmlspecialchars(str_replace("\"", "",$query));
$rows = $result['results'];
$words['hilight'] = $result['hilight'];
$full_result['ent_query'] = $entitiesQuery;
if (isset($result['did_you_mean']) && $translit_el != '1') {
$did_you_mean_b=$entitiesQuery;
$did_you_mean=$entitiesQuery;
while (list($key, $val) = each($result['did_you_mean'])) {
if ($key != $val) {
$did_you_mean_b = str_replace($key, "<b>$val</b>", $did_you_mean_b);
$did_you_mean = str_replace($key, "$val", $did_you_mean);
}
}
} else {
if (isset($result['did_you_mean'])) {
while (list($key, $val) = each($result['did_you_mean'])) {
if ($key != $val) {
$did_you_mean_b = "<b>$val</b>";
$did_you_mean = "$val";
}
}
}
}
if ($did_you_mean) {
$full_result['did_you_mean'] = $did_you_mean;
$full_result['did_you_mean_b'] = $did_you_mean_b;
}
$matchword = $sph_messages["matches"];
if ($rows == 1) { // single result; correct grammar
$matchword = $sph_messages["match"];
}
if($result && !$did_you_mean) { // prevent negative results for count
$num_of_results = count($result) - 3;
}
$full_result['num_of_results'] = $num_of_results;
if ($start < 2 && $loop == '1') {
//if ($start < 2 && $loop == '1' || ($loop == '2' && $rows != '0')) { // will count query-results also if fetched in second loop
$ip = $_SERVER['REMOTE_ADDR'];
saveToLog(addslashes($orig_query), $time, $rows, $ip, 0);
}
$from = ($start-1) * $results_per_page+1;
$to = min(($start)*$results_per_page, $rows);
$full_result['from'] = $from;
$full_result['to'] = $to;
$full_result['total_results'] = $rows;
if ($out == 'xml') { // prepare the XML result file
if (!$rows){
$rows = '0';
}
$xml_result['query'] = $entitiesQuery;
$xml_result['time'] = $time;
$xml_result['total_results'] = $rows;
$xml_result['num_of_results'] = $num_of_results;
if ($did_you_mean) {
$xml_result['did_you_mean'] = $did_you_mean;
}
if ($to) {
$xml_result['from'] = $from;
$xml_result['to'] = $to;
}
}
if ($rows>0) {
$maxweight = $result['maxweight'];
$i = 0;
while ($i < $num_of_results && $i < $results_per_page) {
$title = " ".$result[$i]['title'];
$url = $result[$i]['url'];
$fulltxt = " ".$result[$i]['fulltxt'];
$page_size = $result[$i]['size'];
$domain = $result[$i]['domain'];
if ($cn_seg == '0') {
// create additional 'blank' behind comma etc. in Chinese and Korean text
$fulltxt = separated($fulltxt);
}
$fulltxt = " ".$fulltxt."";
$tmp = $fulltxt;
if ($vowels == "1") { // remove accents
$tmp = remove_acc($fulltxt, '1');
}
if ($noacc_el == "1") { // remove Greek accents
$tmp = remove_acc_el($tmp, '1');
}
if ($case_sensitive == '0') {
if ($mb) { // if available, use Multibyte extention of PHP
$tmp = mb_strtolower($tmp);
} else {
$tmp = lower_ent($tmp);
$tmp = lower_case($tmp);
}
}
if ($page_size != "") $page_size = number_format($page_size, 1)." kb";
if ($all_wild) $words = makeboollist($all_wild, $type);
$words[] = arsort($words['hilight']); // reverse order, to highlight voluminous words first
if ($mb) {
$txtlen = mb_strlen($tmp);
} else {
$txtlen = strlen($tmp);
}
$places = array(); // will hold all start positions of found keyword in full text
if ($txtlen > $desc_length && !$only_links) {
if ($strictsearch) { // if STRICT search enter here
$recovered = str_replace('!', '',trim($query1));
$words['hilight'][0] = "$recovered"; // replace without ' ! '
$strict_length = strlen($recovered);
$found_in = '1'; // pointer position start
$pos_absolut = '0';
foreach($words['hilight'] as $word) {
$word = " ".$word." ";
while (!($found_in =='')) {
if ($mb) {
if ($case_sensitive == 1 ) {
$found_in = mb_strpos($tmp, $word, $offset);
}else {
$found_in = mb_stripos($tmp, $word, $offset);
}
} else {
if ($case_sensitive == 1 ) {
$found_in = strpos($tmp, $word, $offset);
}else {
$found_in = stripos($tmp, $word, $offset);
}
}
$offset = $found_in+strlen($word);
if ($found_in) {
$places[] = $found_in; // remind absolut position of match
}
}
}
//echo "\r\n\r\n<br>places Array:<br><pre>";print_r($places);echo "</pre>\r\n";
} else { // if not strict search enter here (standard search) and find all hits of keyword in full text
$found_in = '';
$hits = '';
foreach($words['hilight'] as $word) {
//echo "\r\n\r\n<br /> word: $word<br />\r\n";
// find position of first query hit
if ($case_sensitive == 1 ) {
if ($mb) {
$found_in = mb_strpos($tmp, $word);
} else {
$found_in = strpos($tmp, $word);
}
} else {
if ($mb) {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_stripos($tmp, $word);
if ($translit_el && !$strictsearch) {
$found2 = mb_stripos($tmp, translit_el($word));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = stripos($tmp, $word);
if ($translit_el && !$strictsearch) {
$found2 = stripos($tmp, translit_el($word));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
}
}
//echo "\r\n\r\n<br /> found_in0: $found_in<br />\r\n";
// enter here, if this search word was found in full text
if ($found_in) {
if ($found_in == 'NULL') {
$places[] = '0'; // if word was found in position 0
} else {
$places[] = $found_in;
$hits = '1';
}
//echo "\r\n\r\n<br>places Array0:<br><pre>";print_r($places);echo "</pre>\r\n";
if ($found_in < $desc_length) {
$end = $desc_length;
} else {
$end = intval($found_in- $desc_length/3)+$desc_length;
}
//echo "\r\n\r\n<br /> txtlen: $txtlen<br />\r\n";
// find all hits, if multiple hits per page are enabled in Admin backend
while ($found_in && $hits < $max_hits && $end < $txtlen) {
if ($found_in >= $end) {
$places[] = $found_in; // save position
$hits++;
// calculate end position of current text extract
if ($found_in < $desc_length) {
$end = $desc_length;
}else {
$end = intval($found_in- $desc_length/3)+$desc_length;
}
}
//echo "\r\n\r\n<br /> end: $end<br />\r\n";
// try to find next position of query hit
if ($case_sensitive == 1 ) {
if ($mb) {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_strpos($tmp, $word, $end);
if ($translit_el && !$strictsearch) {
$found2 = mb_strpos($tmp, translit_el($word), $end);
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = strpos($tmp, $word);
if ($translit_el && !$strictsearch) {
$found2 = strpos($tmp, translit_el($word));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
}
}else {
if ($mb) {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_stripos($tmp, $word, $end);
if ($translit_el && !$strictsearch) {
$found2 = mb_stripos($tmp, translit_el($word), $end);
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = stripos($tmp, $word);
if ($translit_el && !$strictsearch) {
$found2 = stripos($tmp, translit_el($word));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
}
}
//echo "\r\n\r\n<br /> next found_in: $found_in<br />\r\n";
}
}
}
}
sort($places); // sort positions from low to high
//echo "\r\n\r\n<br>places Array:<br><pre>";print_r($places);echo "</pre>\r\n";
// now build text extracts
$this_text = "";
$actual_hit = "";
$hit_id = 0;
$begin = 0;
sort($places_0);
// eliminate hits inside current text extract ( might be caused by multiple search words during AND and OR search)
$place = array();
$place[0] = $places['0'];
if ($places['0'] < $desc_length) {
$end = $desc_length;
} else {
$end = intval($places['0']- $desc_length/3)+$desc_length;
}
foreach ($places as $found_in) {
if ($found_in >= $end) {
$place[] = $found_in; // save position of new hit
// calculate end position of current text extract
if ($found_in < $desc_length) {
$end = $desc_length;
} else {
$end = intval($found_in- $desc_length/3)+$desc_length;
}
}
}
// reduce count of text extracts (might be too many for OR search)
if ($type != 'and') {
$place = array_slice($place, 0, $max_hits);
}
// now build all required text extracts to show all query words
$begin_pos = intval(max(0, $place['0'] - $desc_length/3)); // start position of first text extract
if ($begin_pos < '10') $begin_pos = '0'; // text from the real beginning
if ($mb) {
$this_text = mb_substr($fulltxt, $begin_pos, $desc_length);
} else {
$this_text = substr($fulltxt, $begin_pos, $desc_length);
}
$this_text = strip_tags($this_text);
$begin_pos1 = '0';
if ($begin_pos > 0) {
$begin_pos1 = strpos($this_text, " "); // find first 'blank' to start readable
}
$this_text = mb_substr($this_text, $begin_pos1, $desc_length);
$this_text = mb_substr($this_text, 0, strrpos($this_text, " ")); // find last 'blank' to end
if ($begin_pos < 10) { // no dots in front of text
$actual_hit = "<ul>
<li>" . $this_text . "<strong> . . .</strong></li>
";
} else {
$actual_hit = "<ul>
<li><strong>. . . </strong>" . $this_text . "<strong> . . .</strong></li>
";
}
$hit_id = "1"; // first hit has been found
$txt_id = "1"; // first text extract has beeen build
//while ($places[$hit_id] && $txt_id < $max_hits) { // if activated in Admin settings, show multiple hits
while ($place[$hit_id]) {
if ($hit_id <> $begin) {
$this_text ="";
$begin_pos = intval(max(0, $place[$hit_id] - $desc_length/3));
if ($mb) {
$this_text = mb_substr($fulltxt, $begin_pos, $desc_length);
} else {
$this_text = substr($fulltxt, $begin_pos, $desc_length);
}
if ($place[$hit_id] > 0) {
if($mb) {
$begin_pos1 = mb_strpos($this_text, " ");
} else {
$begin_pos1 = strpos($this_text, " ");
}
}
if($mb) {
$this_text = mb_substr($this_text, $begin_pos1, $desc_length);
$this_text = mb_substr($this_text, 0, strrpos($this_text, " "));
} else {
$this_text = substr($this_text, $begin_pos1, $desc_length);
$this_text = substr($this_text, 0, strrpos($this_text, " "));
}
if ($this_text<> "") {
$actual_hit .= "<li><strong>. . . </strong>" . $this_text . "<strong>. . . </strong></li>
";
}
//echo "\r\n\r\n<br /> actual_hit: $actual_hit<br />\r\n";
}
$hit_id++;
$end_here = $begin_pos + $desc_length; // end position of current text extract
//while ($hit_id && $place[$hit_id] && $place[$hit_id] < $end_here && $txt_id < $max_hits ) {
while ($hit_id && $place[$hit_id] && $place[$hit_id] < $end_here) {
$hit_id++; // if hit is in the current extract of full text, try with the next hit_id
}
$txt_id++; // increment counter for text extract
}
$fulltxt = $actual_hit ."</ul>"; // end of text extract(s) for this page
} else {
// enter here, if full text is shorter than 'Maximum length of page summary' as defined in Admin settings
$fulltxt = "<ul><li>" .$fulltxt ."</li>";
if ($strictsearch) { // if strict search enter here
$recovered = str_replace('!', '',trim($query1));
$words['hilight'][0] = "$recovered"; // replace without ' ! '
}
foreach($words['hilight'] as $word) {
if ($mb) {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_stripos($tmp, $word);
if ($translit_el && !$strictsearch) {
$found2 = mb_stripos($tmp, translit_el($word));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = stripos($tmp, $word);
if ($translit_el && !$strictsearch) {
$found2 = stripos($tmp, translit_el($word));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
}
if ($found_in == 'NULL') {
$places[] = '0'; // if word was found in position 0
} else {
$places[] = $found_in;
}
}
sort($places);
}
if ($sort_results != '7' && $sort_results != '6') {
$weight = number_format($result[$i]['weight']/$maxweight*100, 1); // calculate percentage of weight
}
if ($sort_results == '7' || $sort_results == '6') {
$weight = $result[$i]['weight']; // use hits in fullttext or indexdate instead of weight
}
if ($title=='') {
$title = $sph_messages["Untitled"];
}
if (strlen($title) > $title_length) { // if necessary shorten length of title in result page
$length_tot = strpos($title, " ",$title_length); // find end of last word for shortened title
if ($length_tot) {
$title = substr($title, 0, $length_tot)." ...";
}
}
$url2 = $url;
if (strlen($url) > $url_length) { // if necessary shorten length of URL in result page
$url2 = substr($url, 0, $url_length)."...";
}
// now prepare highlighting of keywords in full text extracts
if (!$only_links) { // not required, if search only search for link text. Already highlighted in function links_only()
if ($places[0] == '' && $sort_results == 7 && $type != 'tol') { // if nothing found in HTML text and query hits as result output
$weight = '0';
}
if ($places[0] == '' && $show_warning == '1' && $type !='tol' && !$only_links || ( $show_warning == '1' && $weight == '0')) { // if no HTML text to highlight
$warnmessage = $sph_messages['showWarning'];
$fulltxt = "<span class='warn'>$warnmessage</span>";
}
if ($mark == 'markbold') {
$highlight = "span class=\"mak_1\"";
}
if ($mark == 'markblue') {
$highlight = "span class=\"mak_2\"";
}
if ($mark == 'markyellow') {
$highlight = "span class=\"mak_3\"";
}
if ($mark == 'markgreen') {
$highlight = "span class=\"mak_4\"";
}
if ($mark == 'markred') {
$highlight = "span class=\"mak_5\"";
}
foreach($words['hilight'] as $change) {
if (!($strictpos === 0) && $index_host == '1' && !$only_links) { // not for strict search and link-only search
$url2 = highlight($url2, $change, $highlight);
}
if ($strictpos === 0 ) { // for strict-search mark the word with blanks before and behind
if ($places[0] == '0') { // if keyword was found in position 0
$change = "".$change." "; // create blanks in order to mark only the pure word
} else {
$change = " ".$change." "; // create blanks in order to mark only the pure word
$title = " ".$title." "; // create blanks as first and last character in title
}
}
$title = highlight($title, $change, $highlight);
$fulltxt = highlight($fulltxt, $change, $highlight);
}
}
$num = $from + $i;
// calculate time consumed to fetch results
$time = round(getmicrotime() - $starttime, 3);
$full_result['time'] = $time;
$full_result['qry_results'][$i]['num'] = $num;
$full_result['qry_results'][$i]['weight'] = $weight;
$full_result['qry_results'][$i]['url'] = $url;
$full_result['qry_results'][$i]['title'] = $title;
$full_result['qry_results'][$i]['fulltxt'] = $fulltxt;
$full_result['qry_results'][$i]['url2'] = $url2;
$full_result['qry_results'][$i]['page_size'] = $page_size;
$full_result['qry_results'][$i]['domain_name'] = $domain;
if ($out == 'xml') { // prepare the XML result file
// remove tags from title
$xml_title = preg_replace ("/<span.*?>/", "", $title);
$xml_title = str_replace ("</span>", "", $xml_title);
$xml_title = str_replace ("<strong>", "", $xml_title);
$xml_title = str_replace ("</strong>", "", $xml_title);
// remove tags from fulltext
$xml_txt = preg_replace ("/<span.*?>/", "", $fulltxt);
$xml_txt = str_replace ("</span>", "", $xml_txt);
$xml_txt = str_replace ("<strong>", "", $xml_txt);
$xml_txt = str_replace ("</strong>", "", $xml_txt);
if ($max_hits == '1') { // text separator for multiple occurrence is not required for single result
$xml_txt = preg_replace ("/<ul>|<li>/", "", $xml_txt);
$xml_txt = str_replace ("</ul>", "", $xml_txt);
$xml_txt = str_replace ("</li>", "", $xml_txt);
}
$xml_result['text_results'][$i]['num'] = $num;
$xml_result['text_results'][$i]['weight'] = $weight;
$xml_result['text_results'][$i]['url'] = $url;
$xml_result['text_results'][$i]['title'] = $xml_title;
$xml_result['text_results'][$i]['fulltxt'] = $xml_txt;
$xml_result['text_results'][$i]['page_size'] = $page_size;
$xml_result['text_results'][$i]['domain_name'] = $domain;
}
$i++;
}
if ($clear == 1) $places = array(); // reset array
}
$pages = ceil($rows / $results_per_page);
$full_result['pages'] = $pages;
$prev = $start - 1;
$full_result['prev'] = $prev;
$next = $start + 1;
$full_result['next'] = $next;
$full_result['start'] = $start;
$full_result['query'] = $entitiesQuery;
if ($from <= $to) {
$firstpage = $start - $links_to_next;
if ($firstpage < 1) $firstpage = 1;
$lastpage = $start + $links_to_next;
if ($lastpage > $pages) $lastpage = $pages;
for ($x=$firstpage; $x<=$lastpage; $x++)
$full_result['other_pages'][] = $x;
}
//echo "<br>full_result Array:<br><pre>";print_r($full_result);echo "</pre>";
if ($out == 'xml' && $xml_name) { // build the XML output file
//add the page infos to XML array
if ($pages > '1') {
$xml_result['pages'] = $pages;
$xml_result['prev'] = $prev;
$xml_result['next'] = $next;
$xml_result['start'] = $start;
}
// now convert the result array to XML file
convert_xml($xml_result, 'text');
}
if ($clear == 1) {
unset ($fulltxt);
$words = array();
$result = array();
$xml_result = array();
}
return $full_result;
}
function separated($string) {
$sep = array
(
"ï¼" => "ï¼ ",
"ã" => "ã ",
"ï¼" => "ï¼ ",
"ã" => "ã ",
"ï¼" => "ï¼ ",
"ï¼" => "ï¼ ",
"â" => "â ",
"â" => "â ",
"ï¼" => "ï¼ "
);
reset($sep);
while ($char = each($sep)) {
$string = preg_replace("/".$char[0]."/i", $char[1], $string);
}
return $string;
}
function highlight($string, $change, $highlight) {
global $case_sensitive, $mb, $vowels, $noacc_el, $translit_el, $home_charset;
if ($mb){
mb_internal_encoding("UTF-8");
$offset = '0';
$length = mb_strlen($change)+ mb_strlen($highlight);
$string = str_replace("İ", "°i", $string); // mb_stripos does not like it, replace the İ
if ($case_sensitive == 1 ) {
if ($vowels || $noacc_el || $translit_el) {
// convert the text to be highlighted with respect to Admin settings
if($vowels) {
$string_ex = remove_acc($string, '1');
} else {
$string_ex = $string;
}
if($noacc_el) {
$string_ex = remove_acc_el($string_ex, '1');
}
// try to find first position of match word
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_strpos($string_ex, $change);
if ($translit_el) {
$found2 = mb_strpos($string_ex, translit_el($change));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
$txtlen = mb_strlen($string_ex);
} else {
$found_in = mb_stripos($string, $change);
$txtlen = mb_strlen($string);
}
while ($found_in !='' && $end < $txtlen) { // loop through all hits in full text
if ($change == "class") {
$string = str_replace("class=", "=ssalc", $string); // replace 'class='
}
$beginn = mb_substr($string, 0, $found_in); // string until word to be highlighted
$rest = mb_substr($string, $found_in); // rest of string incl. word to be highlighted
$string = "".$beginn."<".$highlight.">".$rest.""; // include the highlight start-tag
$end = $found_in+$length+2; // find end of word to be highlighted. +2 because< and > are added to $highlight
$rest_all = mb_substr($string, $end);
$string = "".mb_substr($string, 0, $end)."</span>".$rest_all.""; // include highlight end-tag
$offset = $end+7 ; // +7 because </span> was added
// string_ex needs to be rebuild, because highlighting tags were added to the text
if ($vowels || $noacc_el || $translit_el) {
$string_ex = remove_acc($string, '0');
if ($noacc_el) {
$string_ex = remove_acc_el($string_ex, '0');
}
// try to find position of next hit
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_strpos($string_ex, $change, $offset);
if ($translit_el) {
$found2 = mb_strpos($string_ex, translit_el($change), $offset);
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = mb_strpos($string, $change, $offset); // try to find position of next hit
}
}
} else {
if ($vowels || $noacc_el || $translit_el) {
// convert the text to be highlighted with respect to Admin settings
if($vowels) {
$string_ex = remove_acc($string, '1');
} else {
$string_ex = $string;
}
if($noacc_el) {
$string_ex = remove_acc_el($string_ex, '1');
}
// try to find first position of match word
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_stripos($string_ex, $change);
if ($translit_el) {
$found2 = mb_stripos($string_ex, translit_el($change));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
$txtlen = mb_strlen($string_ex);
} else {
$found_in = mb_stripos($string, $change);
$txtlen = mb_strlen($string);
}
while ($found_in !='' && $end < $txtlen) { // loop through all hits in full text
if ($change == "class") {
$string = str_replace("class=", "=ssalc", $string); // replace 'class='
}
$beginn = mb_substr($string, 0, $found_in); // string until word to be highlighted
$rest = mb_substr($string, $found_in); // rest of string incl. word to be highlighted
$string = "".$beginn."<".$highlight.">".$rest.""; // include the highlight start-tag
$end = $found_in+$length+2; // find end of word to be highlighted. +2 because< and > are added to $highlight
$rest_all = mb_substr($string, $end);
$string = "".mb_substr($string, 0, $end)."</span>".$rest_all.""; // include highlight end-tag
$offset = $end+7 ; // +7 because </span> was added
// string_ex needs to be rebuild, because highlighting tags were added to the text
if ($vowels || $noacc_el || $translit_el) {
$string_ex = remove_acc($string, '0');
if ($noacc_el) {
$string_ex = remove_acc_el($string_ex, '0');
}
// try to find position of next hit
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = mb_stripos($string_ex, $change, $offset);
if ($translit_el) {
$found2 = mb_stripos($string_ex, translit_el($change), $offset);
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = mb_stripos($string, $change, $offset); // try to find position of next hit
}
}
}
$string = str_replace( "°i", "İ", $string); // rebuild, because mb_stripos did not like it
return $string;
} else {
$offset = '0';
$length = strlen($change)+ strlen($highlight);
if ($case_sensitive == 1 ) {
if ($vowels || $noacc_el || $translit_el) {
// convert the text to be highlighted with respect to Admin settings
if($vowels) {
$string_ex = remove_acc($string, '1');
} else {
$string_ex = $string;
}
if($noacc_el) {
$string_ex = remove_acc_el($string_ex, '1');
}
// try to find first position of match word
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = strpos($string_ex, $change);
if ($translit_el) {
$found2 = strpos($string_ex, translit_el($change));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
$txtlen = strlen($string_ex);
} else {
$found_in = stripos($string, $change);
$txtlen = strlen($string);
}
while ($found_in !='' && $end < $txtlen) { // loop through all hits in full text
if ($change == "class") {
$string = str_replace("class=", "=ssalc", $string); // replace 'class='
}
$beginn = substr($string, 0, $found_in); // string until word to be highlighted
$rest = substr($string, $found_in); // rest of string incl. word to be highlighted
$string = "".$beginn."<".$highlight.">".$rest.""; // include the highlight start-tag
$end = $found_in+$length+2; // find end of word to be highlighted. +2 because< and > are added to $highlight
$rest_all = substr($string, $end);
$string = "".substr($string, 0, $end)."</span>".$rest_all.""; // include highlight end-tag
$offset = $end+7 ; // +7 because </span> was added
// string_ex needs to be rebuild, because highlighting tags were added to the text
if ($vowels || $noacc_el || $translit_el) {
$string_ex = remove_acc($string, '0');
if ($noacc_el) {
$string_ex = remove_acc_el($string_ex, '0');
}
// try to find position of next hit
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = strpos($string_ex, $change, $offset);
if ($translit_el) {
$found2 = strpos($string_ex, translit_el($change), $offset);
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = strpos($string, $change, $offset); // try to find position of next hit
}
}
} else {
if ($vowels || $noacc_el || $translit_el) {
// convert the text to be highlighted with respect to Admin settings
if($vowels) {
$string_ex = remove_acc($string, '1');
} else {
$string_ex = $string;
}
if($noacc_el) {
$string_ex = remove_acc_el($string_ex, '1');
}
// try to find first position of match word
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = stripos($string_ex, $change);
if ($translit_el) {
$found2 = stripos($string_ex, translit_el($change));
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
$txtlen = strlen($string_ex);
} else {
$found_in = stripos($string, $change);
$txtlen = strlen($string);
}
while ($found_in !='' && $end < $txtlen) { // loop through all hits in full text
if ($change == "class") {
$string = str_replace("class=", "=ssalc", $string); // replace 'class='
}
$beginn = substr($string, 0, $found_in); // string until word to be highlighted
$rest = substr($string, $found_in); // rest of string incl. word to be highlighted
$string = "".$beginn."<".$highlight.">".$rest.""; // include the highlight start-tag
$end = $found_in+$length+2; // find end of word to be highlighted. +2 because< and > are added to $highlight
$rest_all = substr($string, $end);
$string = "".substr($string, 0, $end)."</span>".$rest_all.""; // include highlight end-tag
$offset = $end+7 ; // +7 because </span> was added
// string_ex needs to be rebuild, because highlighting tags were added to the text
if ($vowels || $noacc_el || $translit_el) {
$string_ex = remove_acc($string, '0');
if ($noacc_el) {
$string_ex = remove_acc_el($string_ex, '0');
}
// try to find position of next hit
$found_in = '';
$found1 = '';
$found2 = '';
$found1 = stripos($string_ex, $change, $offset);
if ($translit_el) {
$found2 = stripos($string_ex, translit_el($change), $offset);
if (!$found1) $found1 = '999999999';
if (!$found2) $found2 = '999999999';
// define the minimum hit position
$found_in = min($found1, $found2);
} else {
$found_in = $found1;
}
} else {
$found_in = stripos($string, $change, $offset); // try to find position of next hit
}
}
}
return $string;
}
}
?>