X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=nucleus%2Flibs%2FSEARCH.php;h=ae28362260b254d4ab5a4e730cb44283b1fa1f58;hb=1b12994176cd3e82b32eca66a99ab4bca9b74760;hp=4420c09f1a4ad2d91013e5255beb02fa98cf0ccb;hpb=b7e5335177b8724f95d0f9b7e08550f4d9ec91b4;p=nucleus-jp%2Fnucleus-next.git diff --git a/nucleus/libs/SEARCH.php b/nucleus/libs/SEARCH.php index 4420c09..ae28362 100644 --- a/nucleus/libs/SEARCH.php +++ b/nucleus/libs/SEARCH.php @@ -1,221 +1,221 @@ -,=,?,!,#,^,(,),[,\],:,;,\\\,%]/","",$text); - $this->querystring = $text; - $this->marked = $this->boolean_mark_atoms($text); - $this->inclusive = $this->boolean_inclusive_atoms($text); - $this->blogs = array(); - - // get all public searchable blogs, no matter what, include the current blog allways. - $res = sql_query('SELECT bnumber FROM '.sql_table('blog').' WHERE bincludesearch=1 '); - while ($obj = sql_fetch_object($res)) - $this->blogs[] = intval($obj->bnumber); - } - - function boolean_sql_select($match){ - if (i18n::strlen($this->inclusive) > 0) { - /* build sql for determining score for each record */ - $result=i18n::explode(" ",$this->inclusive); - for($cth=0;$cth=4){ - $stringsum_long .= " $result[$cth] "; - }else{ - $stringsum_a[] = ' '.$this->boolean_sql_select_short($result[$cth],$match).' '; - } - } - - if(i18n::strlen($stringsum_long)>0){ - $stringsum_long = sql_real_escape_string($stringsum_long); - $stringsum_a[] = " match ($match) against ('$stringsum_long') "; - } - - $stringsum .= implode("+",$stringsum_a); - return $stringsum; - } - } - - function boolean_inclusive_atoms($string){ - $result = trim($string); - $result = preg_replace("#([[:space:]]{2,})#", ' ', $result); - - # replaced eregi_replace() below with preg_replace(). ereg* functions are deprecated in PHP 5.3.0 - # just added delimiters to regex and the 'i' for case-insensitive matching - - /* convert normal boolean operators to shortened syntax */ - $result = preg_replace('# not #i', ' -', $result); - $result = preg_replace('# and #i', ' ', $result); - $result = preg_replace('# or #i', ',', $result); - - /* drop unnecessary spaces */ - $result = str_replace(' ,', ',', $result); - $result = str_replace(', ', ',', $result); - $result = str_replace('- ', '-', $result); - $result = str_replace('+', '', $result); - - /* strip exlusive atoms */ - $result = preg_replace( - "#\-\([A-Za-z0-9]{1,}[A-Za-z0-9\-\.\_\,]{0,}\)#", - '', - $result); - - $result = str_replace('(', ' ', $result); - $result = str_replace(')', ' ', $result); - $result = str_replace(',', ' ', $result); - - return $result; - } - - function boolean_sql_where($match){ - - $result = $this->marked; - - $this->boolean_sql_where_cb1($match); // set the static $match - - $result = preg_replace_callback( - - "/foo\[\(\'([^\)]{4,})\'\)\]bar/", - - array($this,'boolean_sql_where_cb1'), - - $result); - - $this->boolean_sql_where_cb2($match); // set the static $match - - $result = preg_replace_callback( - - "/foo\[\(\'([^\)]{1,3})\'\)\]bar/", - - array($this,'boolean_sql_where_cb2'), - - $result); - - return $result; - - } - - function boolean_sql_where_cb1($matches){ - - static $match; - - if (!is_array($matches)) $match=$matches; - - else return ' match ('.$match.') against (\''.sql_real_escape_string($matches[1]).'\') > 0 '; - - } - - function boolean_sql_where_cb2($matches){ - - static $match; - - if (!is_array($matches)) $match=$matches; - - else return ' ('.$this->boolean_sql_where_short(sql_real_escape_string($matches[1]),$match).') '; - - } - - function boolean_mark_atoms($string){ - $result = trim($string); - $result = preg_replace("/([[:space:]]{2,})/",' ',$result); - - # replaced eregi_replace() below with preg_replace(). ereg* functions are deprecated in PHP 5.3.0 - # just added delimiters to regex and the 'i' for case-insensitive matching - - /* convert normal boolean operators to shortened syntax */ - $result = preg_replace('# not #i', ' -', $result); - $result = preg_replace('# and #i', ' ', $result); - $result = preg_replace('# or #i', ',', $result); - - /* strip excessive whitespace */ - $result = str_replace('( ', '(', $result); - $result = str_replace(' )', ')', $result); - $result = str_replace(', ', ',', $result); - $result = str_replace(' ,', ',', $result); - $result = str_replace('- ', '-', $result); - $result = str_replace('+', '', $result); - - // remove double spaces (we might have introduced some new ones above) - $result = trim($result); - $result = preg_replace("#([[:space:]]{2,})#", ' ', $result); - - /* apply arbitrary function to all 'word' atoms */ - - $result_a = i18n::explode(' ', $result); - - for($word = 0;$word +,=,?,!,#,^,(,),[,\],:,;,\\\,%]/","",$text); + $this->querystring = $text; + $this->marked = $this->boolean_mark_atoms($text); + $this->inclusive = $this->boolean_inclusive_atoms($text); + $this->blogs = array(); + + // get all public searchable blogs, no matter what, include the current blog allways. + $res = DB::getResult('SELECT bnumber FROM '.sql_table('blog').' WHERE bincludesearch=1 '); + foreach ( $res as $row ) + $this->blogs[] = intval($row['bnumber']); + } + + function boolean_sql_select($match){ + if (i18n::strlen($this->inclusive) > 0) { + /* build sql for determining score for each record */ + $result=preg_split("# #",$this->inclusive); + for($cth=0;$cth=4){ + $stringsum_long .= " $result[$cth] "; + }else{ + $stringsum_a[] = ' '.$this->boolean_sql_select_short($result[$cth],$match).' '; + } + } + + if(i18n::strlen($stringsum_long)>0){ + $stringsum_long = DB::quoteValue($stringsum_long); + $stringsum_a[] = " match ({$match}) against ({$stringsum_long}) "; + } + + $stringsum .= implode("+",$stringsum_a); + return $stringsum; + } + } + + function boolean_inclusive_atoms($string){ + $result = trim($string); + $result = preg_replace("#([[:space:]]{2,})#", ' ', $result); + + # replaced eregi_replace() below with preg_replace(). ereg* functions are deprecated in PHP 5.3.0 + # just added delimiters to regex and the 'i' for case-insensitive matching + + /* convert normal boolean operators to shortened syntax */ + $result = preg_replace('# not #i', ' -', $result); + $result = preg_replace('# and #i', ' ', $result); + $result = preg_replace('# or #i', ',', $result); + + /* drop unnecessary spaces */ + $result = str_replace(' ,', ',', $result); + $result = str_replace(', ', ',', $result); + $result = str_replace('- ', '-', $result); + $result = str_replace('+', '', $result); + + /* strip exlusive atoms */ + $result = preg_replace( + "#\-\([A-Za-z0-9]{1,}[A-Za-z0-9\-\.\_\,]{0,}\)#", + '', + $result); + + $result = str_replace('(', ' ', $result); + $result = str_replace(')', ' ', $result); + $result = str_replace(',', ' ', $result); + + return $result; + } + + function boolean_sql_where($match){ + + $result = $this->marked; + + $this->boolean_sql_where_cb1($match); // set the static $match + + $result = preg_replace_callback( + + "/foo\[\(\'([^\)]{4,})\'\)\]bar/", + + array($this,'boolean_sql_where_cb1'), + + $result); + + $this->boolean_sql_where_cb2($match); // set the static $match + + $result = preg_replace_callback( + + "/foo\[\(\'([^\)]{1,3})\'\)\]bar/", + + array($this,'boolean_sql_where_cb2'), + + $result); + + return $result; + + } + + function boolean_sql_where_cb1($matches){ + + static $match; + + if (!is_array($matches)) $match=$matches; + + else return ' match ('.$match.') against ('.DB::quoteValue($matches[1]).') > 0 '; + + } + + function boolean_sql_where_cb2($matches){ + + static $match; + + if (!is_array($matches)) $match=$matches; + + else return ' ('.$this->boolean_sql_where_short($matches[1], $match).') '; + + } + + function boolean_mark_atoms($string){ + $result = trim($string); + $result = preg_replace("/([[:space:]]{2,})/",' ',$result); + + # replaced eregi_replace() below with preg_replace(). ereg* functions are deprecated in PHP 5.3.0 + # just added delimiters to regex and the 'i' for case-insensitive matching + + /* convert normal boolean operators to shortened syntax */ + $result = preg_replace('# not #i', ' -', $result); + $result = preg_replace('# and #i', ' ', $result); + $result = preg_replace('# or #i', ',', $result); + + /* strip excessive whitespace */ + $result = str_replace('( ', '(', $result); + $result = str_replace(' )', ')', $result); + $result = str_replace(', ', ',', $result); + $result = str_replace(' ,', ',', $result); + $result = str_replace('- ', '-', $result); + $result = str_replace('+', '', $result); + + // remove double spaces (we might have introduced some new ones above) + $result = trim($result); + $result = preg_replace("#([[:space:]]{2,})#", ' ', $result); + + /* apply arbitrary function to all 'word' atoms */ + + $result_a = preg_split('# #', $result); + + for($word = 0;$word