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;
}