- Модуль: 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;
}