\|\\\]/', ' ', $cleanText); $cleanText = PKPString::regexp_replace('/[\*]/', $allowWildcards ? '%' : ' ', $cleanText); $cleanText = PKPString::strtolower($cleanText); // Split into words $words = PKPString::regexp_split('/\s+/', $cleanText); // FIXME Do not perform further filtering for some fields, e.g., author names? // Remove stopwords $keywords = array(); foreach ($words as $k) { if (!isset($stopwords[$k]) && PKPString::strlen($k) >= $minLength && !is_numeric($k)) { $keywords[] = PKPString::substr($k, 0, SEARCH_KEYWORD_MAX_LENGTH); } } return $keywords; } /** * Return list of stopwords. * FIXME: Should this be locale-specific? * @return array with stopwords as keys */ static function _loadStopwords() { static $searchStopwords; if (!isset($searchStopwords)) { // Load stopwords only once per request $searchStopwords = array_count_values( array_filter( array_map('trim', file(SEARCH_STOPWORDS_FILE)), function($a) { return !empty($a) && $a[0] != '#'; } ) ); $searchStopwords[''] = 1; } return $searchStopwords; } } ?>