• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/general/filter_dictionary.php
  • Класс: CAllFilterUnquotableWords
  • Вызов: CAllFilterUnquotableWords::CreatePattern
static function CreatePattern($pattern="", $DICTIONARY_ID=0)
{
	$res = "";
	$NotWord = "s.,;:!?#-*|[]()";
	$word_separator = "[".$NotWord."]";
	$pattern = mb_strtolower(trim($pattern));
	$DICTIONARY_ID = intval($DICTIONARY_ID);

	if ($pattern == '')
		return false;

	if ($DICTIONARY_ID == 0)
		$DICTIONARY_ID = (COption::GetOptionString("forum", "FILTER_DICT_T", '', LANGUAGE_ID));
	elseif ($DICTIONARY_ID < 0)
		$DICTIONARY_ID = 0;

	$lettPatt = array();
	$lettersPatt = array();

	$letters = CFilterLetter::GetList(array(), array("DICTIONARY_ID"=>$DICTIONARY_ID));
	while ($lett = $letters->Fetch())
	{
		$space = false;
		$arrRes = array();
		$arrRepl = array();

		$arrRepl = explode(",", $lett["REPLACEMENT"]);
		// create letters.
		for ($ii = 0; $ii < count($arrRepl); $ii++)
		{
			$arrRepl[$ii] = trim($arrRepl[$ii]);
			if (mb_strlen($lett["LETTER"]) == 1)
			{
				if (mb_strlen($arrRepl[$ii]) == 1)
					$arrRes[$ii] = $arrRepl[$ii]."+";
				elseif (mb_substr($arrRepl[$ii], 0, 1) == "(" && (mb_substr($arrRepl[$ii], -1, 1) == ")" || mb_substr($arrRepl[$ii], -2, 1) == ")"))
				{
					if (mb_substr($arrRepl[$ii], -1, 1) == ")")
						$arrRes[$ii] = $arrRepl[$ii]."+";
					else
						$arrRes[$ii] = $arrRepl[$ii];
				}
				elseif (mb_strlen($arrRepl[$ii]) > 1)
					$arrRes[$ii] = "[".$arrRepl[$ii]."]+";
				else
					$space = true;
			}
			else
			{
				if ($arrRepl[$ii] <> '')
					$arrRes[$ii] = $arrRepl[$ii];
			}
		}

		if (mb_strlen($lett["LETTER"]) == 1)
		{
			if ($space)
				$arrRes[] = "";
//					$lettPatt[$lett["LETTER"]] = str_replace("+", "*", $lettPatt[$lett["LETTER"]]);
			$lettPatt[$lett["LETTER"]] = implode("|", $arrRes);
		}
		else
		{
			$lettersPatt["/".preg_quote($lett["LETTER"])."/is".BX_UTF_PCRE_MODIFIER] = "(".implode("|", $arrRes).")";
		}
	}
	// letters
	foreach ($lettersPatt as $key => $val)
		$pattern = preg_replace($key.BX_UTF_PCRE_MODIFIER, $val, $pattern);
	for ($ii = 0; $ii < mb_strlen($pattern); $ii++)
	{
		$sPattern = mb_substr($pattern, $ii, 1);
		if (is_set($lettPatt, mb_substr($pattern, $ii, 1)))
			$res .= "(".$lettPatt[mb_substr($pattern, $ii, 1)].")";
		else
		{
			$ord = ord(mb_substr($pattern, $ii, 1));
			if ((48>$ord) || ((64>$ord) and ($ord>57)) || ((97>$ord) and ($ord>90)) || ((127>$ord) and ($ord>122)))
			{
				if ($ord == 42)
					$res .= "[^".$NotWord."]*";
				elseif ($ord == 43)
					$res .= "[^".$NotWord."]+";
				elseif ($ord == 63)
					$res .= ".?";
				else
					$res .= mb_substr($pattern, $ii, 1);
			}
			else
				$res .= mb_substr($pattern, $ii, 1)."+";
		}
		$res .= $separator;
	}
	$res = "/(?<=".$word_separator.")(".$res.")(?=".$word_separator.")/is".BX_UTF_PCRE_MODIFIER;
	return $res;
}