OSDN Git Service

This commit was generated by cvs2svn to compensate for changes in r4,
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / libs / SEARCH.php
1 <?php
2
3 /**
4   * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/) 
5   * Copyright (C) 2003-2004 The Nucleus Group
6   *
7   * This program is free software; you can redistribute it and/or
8   * modify it under the terms of the GNU General Public License
9   * as published by the Free Software Foundation; either version 2
10   * of the License, or (at your option) any later version.
11   * (see nucleus/documentation/index.html#license for more info)
12   *
13   * SEARCH(querystring) offers different functionality to create an
14   * SQL query to find certain items. (and comments)
15   *
16   * based on code by David Altherr:
17   * http://www.evolt.org/article/Boolean_Fulltext_Searching_with_PHP_and_MySQL/18/15665/
18   * http://davidaltherr.net/web/php_functions/boolean/funcs.mysql.boolean.txt
19   * 
20   *
21   * $Id: SEARCH.php,v 1.1.1.1 2005-02-28 07:14:52 kimitake Exp $
22   */
23
24
25 class SEARCH {
26         
27         var $querystring;
28         var $marked;
29         var $inclusive;
30         var $blogs;
31
32
33     function SEARCH($text) {
34         global $blogid;
35
36 //       $text = preg_replace ("/[<,>,=,?,!,#,^,(,),[,\],:,;,\\\,%]/","",$text);
37
38      /* * * for jp * * * * * * * * * * */
39         $text = str_replace ("\xE3\x80\x80",' ',$text);
40         $text = preg_replace ("/[<>=?!#^()[\]:;\\%]/","",$text);
41
42         $this->ascii = '[\x00-\x7F]';
43         $this->two = '[\xC0-\xDF][\x80-\xBF]';
44         $this->three = '[\xE0-\xEF][\x80-\xBF][\x80-\xBF]';
45
46         $this->jpmarked      = $this->boolean_mark_atoms_jp($text);
47      /* * * * * * * * * * * * * * * * */
48
49         $this->querystring      = $text;
50 //        $this->marked         = $this->boolean_mark_atoms($text);
51         $this->inclusive        = $this->boolean_inclusive_atoms($text);
52         $this->blogs            = array();
53
54         // get all public searchable blogs, no matter what, include the current blog allways.
55                 $res = sql_query('SELECT bnumber FROM '.sql_table('blog').' WHERE bincludesearch=1 ');
56                 while ($obj = mysql_fetch_object($res)) 
57                     $this->blogs[] = intval($obj->bnumber);
58         }
59
60     function  boolean_sql_select($match){
61 //        $string = $this->inclusive;
62 //        if (strlen($string) > 0) {
63            /* build sql for determining score for each record */
64 /*
65                preg_match_all(
66                                    "([A-Za-z0-9]{1,}[A-Za-z0-9\-\.\_]{0,})",
67                                $string,
68                                $result);
69            $result = $result[0];
70                  for($cth=0;$cth<count($result);$cth++){
71              if(strlen($result[$cth])>=4){
72                    $stringsum_long .=  " $result[$cth] ";
73                      }else{
74                        $stringsum_a[] = ' '.$this->boolean_sql_select_short($result[$cth],$match).' ';
75                      }
76                  }
77              if(strlen($stringsum_long)>0){
78                                 $stringsum_long = addslashes($stringsum_long);
79                         $stringsum_a[] = " match ($match) against ('$stringsum_long') ";
80              }
81                  $stringsum .= implode("+",$stringsum_a);
82              return $stringsum;
83             }
84 */
85     }
86
87     
88
89     function boolean_inclusive_atoms($string){
90         $result=trim($string);
91         $result=preg_replace("/([[:space:]]{2,})/",' ',$result);
92
93         /* convert normal boolean operators to shortened syntax */
94         $result=eregi_replace(' not ',' -',$result);
95         $result=eregi_replace(' and ',' ',$result);
96         $result=eregi_replace(' or ',',',$result);
97
98         /* drop unnecessary spaces */
99         $result=str_replace(' ,',',',$result);
100         $result=str_replace(', ',',',$result);
101         $result=str_replace('- ','-',$result);
102         $result=str_replace('+','',$result);
103
104         /* strip exlusive atoms */
105         $result=preg_replace(
106 //              "(\-\([A-Za-z0-9]{1,}[A-Za-z0-9\-\.\_\,]{0,}\))",
107                 "(\-\(([A-Za-z0-9]|$this->two|$this->three){1,}([A-Za-z0-9\-\.\_\,]|$this->two|$this->three){0,}\))",
108                 '',
109                 $result);
110
111         $result=preg_replace(
112 //              "(\-[A-Za-z0-9]{1,}[A-Za-z0-9\-\.\_]{0,})",
113                 "(\-([A-Za-z0-9]|$this->two|$this->three){1,}([A-Za-z0-9\-\.\_\,]|$this->two|$this->three){0,})",
114                 '',
115                 $result);
116
117         $result=str_replace('(',' ',$result);
118         $result=str_replace(')',' ',$result);
119         $result=str_replace(',',' ',$result);
120
121         return $result;
122     }
123
124     function boolean_sql_where($match){
125 /*
126         $result = $this->marked;
127         $result = preg_replace(
128                 "/foo\[\(\'([^\)]{4,})\'\)\]bar/e",
129                 " 'match ('.\$match.') against (\''.\$this->copyvalue(\"$1\").'\') > 0 ' ",
130                 $result);
131
132         $result = preg_replace(                 
133             "/foo\[\(\'([^\)]{1,3})\'\)\]bar/e",
134             " '('.\$this->boolean_sql_where_short(\"$1\",\"$match\").')' ",             
135             $result);
136 */
137       $result = $this->jpmarked; /* for jp */
138         $result = $this->boolean_sql_where_jp_short($result,$match);/* for jp */
139         return $result;
140     }
141
142     // there must be a simple way to simply copy a value with backslashes in it through
143     // the preg_replace, but I cannot currently find it (karma 2003-12-30)
144     function copyvalue($foo) {
145         return $foo;
146     }
147
148 /***********************************************
149   Make "WHERE" (jp)
150 ***********************************************/
151
152     function boolean_mark_atoms_jp($string){
153
154         $result=trim($string);
155         $result=preg_replace("/([[:space:]]{2,})/",' ',$result);
156         
157         /* convert normal boolean operators to shortened syntax */
158         $result=eregi_replace(' not ',' -',$result);
159         $result=eregi_replace(' and ',' ',$result);
160         $result=eregi_replace(' or ',',',$result);
161
162         /* strip excessive whitespace */
163         $result=str_replace(', ',',',$result);
164         $result=str_replace(' ,',',',$result);
165         $result=str_replace('- ','-',$result);
166         $result=str_replace('+','',$result);
167         
168         $result=str_replace(',',' ,',$result);
169         
170         // remove double spaces (we might have introduced some new ones above)
171         $result=trim($result);
172         $result=preg_replace("/([[:space:]]{2,})/",' ',$result);
173         
174         return $result;
175     }
176     
177
178     function boolean_sql_where_jp_short($string,$match){
179         $match_a = explode(',',$match);
180                         $key_a = explode(' ',$string);
181                         
182         for($ith=0;$ith<count($match_a);$ith++){
183                 $temp_a[$ith] = "(i.$match_a[$ith] LIKE '%" . addslashes($key_a[0]) . "%') ";
184         }
185         $like = '('.implode(' or ',$temp_a).')';
186
187                         for($kn=1; $kn<count($key_a); $kn++){
188                 if(substr($key_a[$kn],0,1) == ","){
189                         for($ith=0;$ith<count($match_a);$ith++){
190                                 $temp_a[$ith] = " (i.$match_a[$ith] LIKE '%" . addslashes(substr($key_a[$kn],1)) . "%') ";
191                         }
192                         $like .=' OR ('. implode(' or ',$temp_a).')';
193                 }elseif(substr($key_a[$kn],0,1) != '-'){
194                         for($ith=0;$ith<count($match_a);$ith++){
195                                 $temp_a[$ith] = " (i.$match_a[$ith] LIKE '%" . addslashes($key_a[$kn]) . "%') ";
196                         }
197                         $like .=' AND ('. implode(' or ',$temp_a).')';
198                 }else{
199                         for($ith=0;$ith<count($match_a);$ith++){
200                                 $temp_a[$ith] = " NOT(i.$match_a[$ith] LIKE '%" . addslashes(substr($key_a[$kn],1)) . "%') ";
201                         }
202                         $like .=' AND ('. implode(' and ',$temp_a).')';
203                 }
204         }
205         
206         $like = '('.$like.')';
207         return $like;
208     }
209
210 /***********************************************/
211
212
213 /*
214     function boolean_mark_atoms($string){
215         $result=trim($string);
216         $result=preg_replace("/([[:space:]]{2,})/",' ',$result);
217
218         //convert normal boolean operators to shortened syntax
219         $result=eregi_replace(' not ',' -',$result);
220         $result=eregi_replace(' and ',' ',$result);
221         $result=eregi_replace(' or ',',',$result);
222
223
224         //strip excessive whitespace
225         $result=str_replace('( ','(',$result);
226         $result=str_replace(' )',')',$result);
227         $result=str_replace(', ',',',$result);
228         $result=str_replace(' ,',',',$result);
229         $result=str_replace('- ','-',$result);
230         $result=str_replace('+','',$result);
231         // apply arbitrary function to all 'word' atoms
232
233         $result_a = explode(" ",$result);
234         for($word=0;$word<count($result_a);$word++){
235             $result_a[$word] = "foo[('".$result_a[$word]."')]bar";
236         }
237         $result = implode(" ",$result_a);
238         
239         // dispatch ' ' to ' AND '
240         $result=str_replace(' ',' AND ',$result);
241
242         // dispatch ',' to ' OR '
243         $result=str_replace(',',' OR ',$result);
244
245         // dispatch '-' to ' NOT '
246         $result=str_replace(' -',' NOT ',$result);
247         return $result;
248     }
249     
250     function boolean_sql_where_short($string,$match){
251         $match_a = explode(',',$match);
252         for($ith=0;$ith<count($match_a);$ith++){
253                 $like_a[$ith] = " $match_a[$ith] LIKE '% $string %' ";
254         }
255         $like = implode(" OR ",$like_a);
256
257         return $like;
258     }
259     function boolean_sql_select_short($string,$match){
260         $match_a = explode(',',$match);
261         $score_unit_weight = .2;
262         for($ith=0;$ith<count($match_a);$ith++){
263             $score_a[$ith] =
264                            " $score_unit_weight*(
265                            LENGTH(" . addslashes($match_a[$ith]) . ") -
266                            LENGTH(REPLACE(LOWER(" . addslashes($match_a[$ith]) . "),LOWER('" . addslashes($string) . "'),'')))
267                                        /LENGTH('" . addslashes($string) . "') ";
268         }
269             $score = implode(" + ",$score_a);
270
271         return $score;
272     }
273 */
274
275 }
276 ?>