diff options
Diffstat (limited to 'phpBB/phpbb/search/fulltext_native.php')
-rw-r--r-- | phpBB/phpbb/search/fulltext_native.php | 70 |
1 files changed, 28 insertions, 42 deletions
diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php index 730c3a6c2d..7d51d164c7 100644 --- a/phpBB/phpbb/search/fulltext_native.php +++ b/phpBB/phpbb/search/fulltext_native.php @@ -7,20 +7,14 @@ * */ -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ - exit; -} +namespace phpbb\search; /** * fulltext_native * phpBB's own db driven fulltext search, version 2 * @package search */ -class phpbb_search_fulltext_native extends phpbb_search_base +class fulltext_native extends \phpbb\search\base { /** * Associative array holding index stats @@ -80,19 +74,19 @@ class phpbb_search_fulltext_native extends phpbb_search_base /** * Config object - * @var phpbb_config + * @var \phpbb\config\config */ protected $config; /** * Database connection - * @var phpbb_db_driver + * @var \phpbb\db\driver\driver_interface */ protected $db; /** * User object - * @var phpbb_user + * @var \phpbb\user */ protected $user; @@ -283,7 +277,7 @@ class phpbb_search_fulltext_native extends phpbb_search_base // We limit the number of allowed keywords to minimize load on the database if ($this->config['max_num_search_keywords'] && $num_keywords > $this->config['max_num_search_keywords']) { - trigger_error($this->user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', $this->config['max_num_search_keywords'], $num_keywords)); + trigger_error($this->user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', (int) $this->config['max_num_search_keywords'], $num_keywords)); } // $keywords input format: each word separated by a space, words in a bracket are not separated @@ -331,7 +325,12 @@ class phpbb_search_fulltext_native extends phpbb_search_base } $this->db->sql_freeresult($result); } - unset($exact_words); + + // Handle +, - without preceeding whitespace character + $match = array('#(\S)\+#', '#(\S)-#'); + $replace = array('$1 +', '$1 +'); + + $keywords = preg_replace($match, $replace, $keywords); // now analyse the search query, first split it using the spaces $query = explode(' ', $keywords); @@ -457,39 +456,21 @@ class phpbb_search_fulltext_native extends phpbb_search_base $this->{$mode . '_ids'}[] = $words[$word]; } } - // throw an error if we shall not ignore unexistant words - else if (!$ignore_no_id) + else { if (!isset($common_ids[$word])) { $len = utf8_strlen($word); - if ($len >= $this->word_length['min'] && $len <= $this->word_length['max']) - { - trigger_error(sprintf($this->user->lang['WORD_IN_NO_POST'], $word)); - } - else + if ($len < $this->word_length['min'] || $len > $this->word_length['max']) { $this->common_words[] = $word; } } } - else - { - $len = utf8_strlen($word); - if ($len < $this->word_length['min'] || $len > $this->word_length['max']) - { - $this->common_words[] = $word; - } - } - } - - // we can't search for negatives only - if (!sizeof($this->must_contain_ids)) - { - return false; } - if (!empty($this->search_query)) + // Return true if all words are not common words + if (sizeof($exact_words) - sizeof($this->common_words) > 0) { return true; } @@ -524,6 +505,12 @@ class phpbb_search_fulltext_native extends phpbb_search_base return false; } + // we can't search for negatives only + if (empty($this->must_contain_ids)) + { + return false; + } + $must_contain_ids = $this->must_contain_ids; $must_not_contain_ids = $this->must_not_contain_ids; $must_exclude_one_ids = $this->must_exclude_one_ids; @@ -848,7 +835,6 @@ class phpbb_search_fulltext_native extends phpbb_search_base } $this->db->sql_freeresult($result); - // if we use mysql and the total result count is not cached yet, retrieve it from the db if (!$total_results && $is_mysql) { @@ -1187,8 +1173,8 @@ class phpbb_search_fulltext_native extends phpbb_search_base * we know that it will also be lower than CJK ranges */ if ((strncmp($word, UTF8_HANGUL_FIRST, 3) < 0 || strncmp($word, UTF8_HANGUL_LAST, 3) > 0) - && (strncmp($word, UTF8_CJK_FIRST, 3) < 0 || strncmp($word, UTF8_CJK_LAST, 3) > 0) - && (strncmp($word, UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, UTF8_CJK_B_LAST, 4) > 0)) + && (strncmp($word, UTF8_CJK_FIRST, 3) < 0 || strncmp($word, UTF8_CJK_LAST, 3) > 0) + && (strncmp($word, UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, UTF8_CJK_B_LAST, 4) > 0)) { $word = strtok(' '); continue; @@ -1556,7 +1542,7 @@ class phpbb_search_fulltext_native extends phpbb_search_base * @param string $encoding Text encoding * @return string Cleaned up text, only alphanumeric chars are left * - * @todo normalizer::cleanup being able to be used? + * @todo \normalizer::cleanup being able to be used? */ protected function cleanup($text, $allowed_chars = null, $encoding = 'utf-8') { @@ -1588,7 +1574,7 @@ class phpbb_search_fulltext_native extends phpbb_search_base * If we use it more widely, an instance of that class should be held in a * a global variable instead */ - utf_normalizer::nfc($text); + \utf_normalizer::nfc($text); /** * The first thing we do is: @@ -1682,8 +1668,8 @@ class phpbb_search_fulltext_native extends phpbb_search_base $pos += $utf_len; if (($utf_char >= UTF8_HANGUL_FIRST && $utf_char <= UTF8_HANGUL_LAST) - || ($utf_char >= UTF8_CJK_FIRST && $utf_char <= UTF8_CJK_LAST) - || ($utf_char >= UTF8_CJK_B_FIRST && $utf_char <= UTF8_CJK_B_LAST)) + || ($utf_char >= UTF8_CJK_FIRST && $utf_char <= UTF8_CJK_LAST) + || ($utf_char >= UTF8_CJK_B_FIRST && $utf_char <= UTF8_CJK_B_LAST)) { /** * All characters within these ranges are valid |