• Модуль: search
  • Путь к файлу: ~/bitrix/modules/search/classes/general/search.php
  • Класс: CAllSearchQuery
  • Вызов: CAllSearchQuery::ParseStr
function ParseStr($qwe)
{
	//Take alphabet into account
	$arStemInfo = stemming_init($this->m_lang);
	$letters = $arStemInfo["pcre_letters"]."|+&~()";

	//Erase delimiters from the query
	$qwe = trim(preg_replace("/[^".$letters."]+/".BX_UTF_PCRE_MODIFIER, " ", $qwe));

	// query language normalizer
	if (!$this->no_bool_lang)
	{
		$qwe = preg_replace("/(\s+|^|[|&~])or(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1|\2", $qwe);
		$qwe = preg_replace("/(\s+|^|[|&~])and(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1&\2", $qwe);
		$qwe = preg_replace("/(\s+|^|[|&~])not(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1~\2", $qwe);
		$qwe = preg_replace("/(\s+|^|[|&~])without(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1~\2", $qwe);

		if ($this->rus_bool_lang == 'yes')
		{
			$qwe = preg_replace("/(\s+|^|[|&~])".GetMessage("SEARCH_TERM_OR")."(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1|\2", $qwe);
			$qwe = preg_replace("/(\s+|^|[|&~])".GetMessage("SEARCH_TERM_AND")."(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1&\2", $qwe);
			$qwe = preg_replace("/(\s+|^|[|&~])".GetMessage("SEARCH_TERM_NOT_1")."(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1~\2", $qwe);
			$qwe = preg_replace("/(\s+|^|[|&~])".GetMessage("SEARCH_TERM_NOT_2")."(\s+|$|[|&~])/is".BX_UTF_PCRE_MODIFIER, "\1~\2", $qwe);
		}
	}

	$qwe = preg_replace("/(\s*\|+\s*)/is".BX_UTF_PCRE_MODIFIER, "|", $qwe);
	$qwe = preg_replace("/(\s*\++\s*|\s*\&\s*)/is".BX_UTF_PCRE_MODIFIER, "&", $qwe);
	$qwe = preg_replace("/(\s*\~+\s*)/is".BX_UTF_PCRE_MODIFIER, "~", $qwe);

	$qwe = preg_replace("/s*([()])s*/s".BX_UTF_PCRE_MODIFIER, "\1", $qwe);

	// default query type is and
	if (mb_strtolower($this->default_query_type) == 'or')
		$default_op = "|";
	else
		$default_op = "&";

	$qwe = preg_replace("/(s+|&|+||&+)/s".BX_UTF_PCRE_MODIFIER, $default_op, $qwe);

	// remove unnesessary boolean operators
	$qwe = preg_replace("/|+/", "|", $qwe);
	$qwe = preg_replace("/&+/", "&", $qwe);
	$qwe = preg_replace("/~+/", "~", $qwe);
	$qwe = preg_replace("/|&|/", "&", $qwe);
	$qwe = preg_replace("/[|&~]+$/", "", $qwe);
	$qwe = preg_replace("/^[|&]+/", "", $qwe);

	// transform "w1 ~w2" -> "w1 default_op ~ w2"
	// ") ~w" -> ") default_op ~w"
	// "w ~ (" -> "w default_op ~("
	// ") w" -> ") default_op w"
	// "w (" -> "w default_op ("
	// ")(" -> ") default_op ("

	$qwe = preg_replace("/([^&~|()]+)~([^&~|()]+)/s".BX_UTF_PCRE_MODIFIER, "\1".$default_op."~\2", $qwe);
	$qwe = preg_replace("/)~{1,}/s".BX_UTF_PCRE_MODIFIER, ")".$default_op."~", $qwe);
	$qwe = preg_replace("/~{1,}(/s".BX_UTF_PCRE_MODIFIER, ($default_op == "|"? "~|(": "&~("), $qwe);
	$qwe = preg_replace("/)([^&~|()]+)/s".BX_UTF_PCRE_MODIFIER, ")".$default_op."\1", $qwe);
	$qwe = preg_replace("/([^&~|()]+)(/s".BX_UTF_PCRE_MODIFIER, "\1".$default_op."(", $qwe);
	$qwe = preg_replace("/) *(/s".BX_UTF_PCRE_MODIFIER, ")".$default_op."(", $qwe);

	// remove unnesessary boolean operators
	$qwe = preg_replace("/|+/", "|", $qwe);
	$qwe = preg_replace("/&+/", "&", $qwe);

	// remove errornous format of query - ie: '(&', '&)', '(|', '|)', '~&', '~|', '~)'
	$qwe = preg_replace("/(&{1,}/s", "(", $qwe);
	$qwe = preg_replace("/&{1,})/s", ")", $qwe);
	$qwe = preg_replace("/~{1,})/s", ")", $qwe);
	$qwe = preg_replace("/(|{1,}/s", "(", $qwe);
	$qwe = preg_replace("/|{1,})/s", ")", $qwe);
	$qwe = preg_replace("/~{1,}&{1,}/s", "&", $qwe);
	$qwe = preg_replace("/~{1,}|{1,}/s", "|", $qwe);

	$qwe = preg_replace("/()/s", "", $qwe);
	$qwe = preg_replace("/^[|&]{1,}/s", "", $qwe);
	$qwe = preg_replace("/[|&~]{1,}$/s", "", $qwe);
	$qwe = preg_replace("/|&/s", "&", $qwe);
	$qwe = preg_replace("/&|/s", "|", $qwe);

	// remove unnesessary boolean operators one more time
	$qwe = preg_replace("/|+/", "|", $qwe);
	$qwe = preg_replace("/&+/", "&", $qwe);

	return $qwe;
}