/** * Returns censored words from a text. * * @param string $text * @return mixed $matches / false */ public static function test($text) { // reset matches self::$matches = array(); // get words which should be censored $censoredWords = explode("\n", StringUtil::unifyNewlines(StringUtil::toLowerCase(CENSORED_WORDS))); // format censored words $censoredWords = ArrayUtil::trim($censoredWords); // string to lower case $text = StringUtil::toLowerCase($text); // ignore bbcode tags $text = preg_replace('~\\[/?[a-z]+[^\\]]*\\]~i', '', $text); // split the text in single words self::$words = preg_split("!" . self::$delimiters . "+!", $text, -1, PREG_SPLIT_NO_EMPTY); // check each word if it censored. for ($i = 0, $count = count(self::$words); $i < $count; $i++) { $word = self::$words[$i]; foreach ($censoredWords as $censoredWord) { // check for direct matches ("badword" == "badword") if ($censoredWord == $word) { // store censored word if (isset(self::$matches[$word])) { self::$matches[$word]++; } else { self::$matches[$word] = 1; } continue 2; } else { if (StringUtil::indexOf($censoredWord, '*') !== false) { $censoredWord = StringUtil::replace('\\*', '.*', preg_quote($censoredWord)); if (preg_match('!^' . $censoredWord . '$!', $word)) { // store censored word if (isset(self::$matches[$word])) { self::$matches[$word]++; } else { self::$matches[$word] = 1; } continue 2; } } else { if (StringUtil::indexOf($censoredWord, '~') !== false) { $censoredWord = StringUtil::replace('~', '', $censoredWord); if (($position = StringUtil::indexOf($censoredWord, $word)) !== false) { if ($position > 0) { // look behind if (!self::lookBehind($i - 1, StringUtil::substring($censoredWord, 0, $position))) { continue; } } if ($position + StringUtil::length($word) < StringUtil::length($censoredWord)) { // look ahead if ($newIndex = self::lookAhead($i + 1, StringUtil::substring($censoredWord, $position + StringUtil::length($word)))) { $i = $newIndex; } else { continue; } } // store censored word if (isset(self::$matches[$censoredWord])) { self::$matches[$censoredWord]++; } else { self::$matches[$censoredWord] = 1; } continue 2; } } } } } } // at least one censored word was found if (count(self::$matches) > 0) { return self::$matches; } else { return false; } }