Вход Регистрация
Файл: sys/classes/text.class.php
Строк: 718
<?php

#Работа с текстом

class text {

    static function 
password($pass) {
        if (
preg_match("#^[a-zа-яё0-9-_ ]{6,32}$#ui"$pass)) {
            return 
true;
        }
    }

    static function 
censure($s$delta 3$continue "xe2x80xa6") {
        
#предлоги русского языка:
        #[всуо]|
        #по|за|на|об|до|от|вы|вс|вз|из|ис|
        #под|про|при|над|низ|раз|рас|воз|вос|
        #пооб|повы|пона|поза|недо|пере|одно|
        #полуза|произ|пораз|много|
        
static $pretext = array(
            
#1
            
'[уyоo]_?        (?=[еёeхx])'#у, о   (уебать, охуеть)
            
'[вvbсc]_?       (?=[хпбмгжxpmgj])'#в, с   (впиздячить, схуярить)
            
'[вvbсc]_?[ъь]_? (?=[еёe])'#въ, съ (съебаться, въебать)
            
'ё_?             (?=[бb])'#ё      (ёбля)
            #2
            
'[вvb]_?[ыi]_?'#вы
            
'[зz3]_?[аa]_?'#за
            
'[нnh]_?[аaеeиi]_?'#на, не, ни
            
'[вvb]_?[сc]_?          (?=[хпбмгжxpmgj])'#вс (вспизднуть)
            
'[оo]_?[тtбb]_?         (?=[хпбмгжxpmgj])'#от, об
            
'[оo]_?[тtбb]_?[ъь]_?   (?=[еёe])'#отъ, объ
            
'[иiвvb]_?[зz3]_?       (?=[хпбмгжxpmgj])'#[ив]з
            
'[иiвvb]_?[зz3]_?[ъь]_? (?=[еёe])'#[ив]зъ
            
'[иi]_?[сc]_?           (?=[хпбмгжxpmgj])'#ис
            
'[пpдdg]_?[оo]_? (?> [бb]_?         (?=[хпбмгжxpmgj])
                           | [бb]_?  [ъь]_? (?=[еёe])
                           | [зz3]_? [аa] _?
                         )?'
#по, до, пообъ, дообъ, поза, доза (двойные символы вырезаются!)
            #3
            
'[пp]_?[рr]_?[оoиi]_?'#пр[ои]
            
'[зz3]_?[лl]_?[оo]_?'#зло (злоебучая)
            
'[нnh]_?[аa]_?[дdg]_?         (?=[хпбмгжxpmgj])'#над
            
'[нnh]_?[аa]_?[дdg]_?[ъь]_?   (?=[еёe])'#надъ
            
'[пp]_?[оo]_?[дdg]_?          (?=[хпбмгжxpmgj])'#под
            
'[пp]_?[оo]_?[дdg]_?[ъь]_?    (?=[еёe])'#подъ
            
'[рr]_?[аa]_?[зz3сc]_?        (?=[хпбмгжxpmgj])'#ра[зс]
            
'[рr]_?[аa]_?[зz3сc]_?[ъь]_?  (?=[еёe])'#ра[зс]ъ
            
'[вvb]_?[оo]_?[зz3сc]_?       (?=[хпбмгжxpmgj])'#во[зс]
            
'[вvb]_?[оo]_?[зz3сc]_?[ъь]_? (?=[еёe])'#во[зс]ъ
            #4
            
'[нnh]_?[еe]_?[дdg]_?[оo]_?'#недо
            
'[пp]_?[еe]_?[рr]_?[еe]_?'#пере
            
'[oо]_?[дdg]_?[нnh]_?[оo]_?'#одно
            
'[кk]_?[oо]_?[нnh]_?[оo]_?'#коно (коноебиться)
            
'[мm]_?[уy]_?[дdg]_?[оoаa]_?'#муд[оа] (мудаёб)
            
'[oо]_?[сc]_?[тt]_?[оo]_?'#осто (остопиздело)
            
'[дdg]_?[уy]_?[рpr]_?[оoаa]_?'#дур[оа]
            
'[хx]_?[уy]_?[дdg]_?[оoаa]_?'#худ[оа] (худоебина)
            #5
            
'[мm]_?[нnh]_?[оo]_?[гg]_?[оo]_?'#много
            
'[мm]_?[оo]_?[рpr]_?[дdg]_?[оoаa]_?'#морд[оа]
            
'[мm]_?[оo]_?[зz3]_?[гg]_?[оoаa]_?'#мозг[оа]
            
'[дdg]_?[оo]_?[лl]_?[бb6]_?[оoаa]_?'#долб[оа]
        
);

        static 
$badwords = array(
            
#Слово на букву Х
            
'(?<=[_d]) {RE_PRETEXT}?
         [hхx]_?[уyu]_?[йiеeёяюju]     #хуй, хуя, хую, хуем, хуёвый
         #исключения:
         (?<! _hue(?=_)    #HUE    -- цветовая палитра
            | _hue(?=so_)  #hueso  -- испанское слово
            | _хуе(?=дин)  #Хуедин -- город в Румынии
         )'
,
            
#Слово на букву П
            
'(?<=[_d]) {RE_PRETEXT}?
         [пp]_?[иi]_?[зz3]_?[дd]_?[:vowel:]'
#пизда, пизде, пиздёж, пизду, пиздюлина, пиздобол, опиздинеть, пиздых
            #Слово на букву Е
            
'(?<=[_d]) {RE_PRETEXT}?
         [eеё]_? (?<!не[её]_) [бb6]_?(?: [уyиi]_                       #ебу, еби
                                       | [ыиiоoaаеeёуy]_?[:consonant:] #ебут, ебать, ебись, ебёт, поеботина, выебываться, ёбарь
                                       | [лl][оoаaыиi]                 #ебло, ебла, ебливая, еблись, еблысь
                                       | [нn]_?[уy]                    #ёбнул, ёбнутый
                                       | [кk]_?[аa]                    #взъёбка
                                      )'
,
            
'(?<=[_d]) {RE_PRETEXT}
         (?<=[^_d][^_d]|[^_d]_[^_d]_) [eеё]_?[бb6] (?:_|_?[аa]_?[^_d])'
#долбоёб, дураёб, изъёб, заёб, разъебай
            #Слово на букву Б
            
'(?<=[_d]) {RE_PRETEXT}?
         [бb6]_?[лl]_?(?:я|ya)(?: _       #бля
                                | _?[тд]  #блять, бляди
                              )'
,
            
#ПИДОР
            
'(?<=[_d]) [пp]_?[иieе]_?[дdg]_?[eеaаoо]_?[rpр]'#п[ие]д[оеа]р
            #МУДАК
            
'(?<=[_d]) [мm]_?[уy]_?[дdg]_?[аa]'#муда
            #ЖОПА
            
'(?<=[_d]) [zж]_?h?_?[оo]_?[pп]_?[aаyуыiеeoо]'#жоп[ауыео]
            #МАНДА
            #исключения: город Мандалай, округ Мандаль, индейский народ Мандан, фамилия Мандель
            
'(?<=[_d]) [мm]_?[аa]_?[нnh]_?[дdg]_?[aаyуыiеeoо](?<! манда(?=[лн])|манде(?=ль ))'#манд[ауыео]
            #ГОВНО
            
'(?<=[_d]) [гg]_?[оo]_?[вvb]_?[нnh]_?[оoаaяеeyу]'#говн[оаяеу]
            #FUCK
            
'(?<=[_d]) f_?u_?[cс]_?k'#fuck

                /*
                  #ЛОХ
                  ' л_?[оo]_?[хx]',

                  #СУКА
                  '[^р]_?[scс]_?[yуu]_?[kк]_?[aаiи]', #сука (кроме слова "барсука" - это животное-грызун)
                  '[^р]_?[scс]_?[yуu]_?[4ч]_?[кk]',   #сучк(и) (кроме слова "барсучка")

                  #ХЕР
                  ' {RE_PRETEXT}?[хxh]_?[еe]_?[рpr](_?[нnh]_?(я|ya)| )', #{RE_PRETEXT}хер(ня)

                  #ЗАЛУПА
                  ' [зz3]_?[аa]_?[лl]_?[уy]_?[пp]_?[аa]',
                 */
        
);

        static 
$re_trans = array(
            
'_' => 'x20'#пробел
            
'[:vowel:]' => '[аеиоуыэюяёaeioyu]'#гласные буквы
            
'[:consonant:]' => '[^аеиоуыэюяёaeioyux20d]'#согласные буквы
        
);
        
$re_badwords str_replace('{RE_PRETEXT}''(?>' implode('|'$pretext) . ')''~' implode('|'$badwords) . '~sxu');
        
$re_badwords strtr($re_badwords$re_trans);

        
#вырезаем все лишнее
        #скрипты не вырезаем, т.к. м.б. обходной маневр на с кодом на javascript:
        #<script>document.write('сло'+'во')</script>
        #хотя давать пользователю возможность использовать код на javascript нехорошо

        
$s self::strip_tags_smart($snulltrue, array('comment''style''map''frameset''object''applet'));
        
#заменяем html-сущности в "чистый" UTF-8
        
$s self::utf8_html_entity_decode($s$is_htmlspecialchars true);
        
$s self::utf8_convert_case($sCASE_LOWER);

        static 
$trans = array(
            
"xc2xad" => ''#вырезаем "мягкий" перенос строки (&shy;)
            
"xccx81" => ''#вырезаем знак ударения (U+0301 «combining acute accent»)
            
'/\' => 'л', #Б/Я
            '
/|' => 'л', #Б/|Я
            "xd0xb5xd0xb5" => "xd0xb5xd1x91", #ее => её
        );
        $s = strtr($s, $trans);

        #получаем в массив только буквы и цифры
        #"с_л@о#во,сxc2xa7лово.Слово" -> "слово слово слово"
        preg_match_all('
/(?> xd0[xb0-xbf]|xd1[x80-x8fx91]  #[а-я]
                      |  [a-zd]+
                      )+
                    /sx', $s, $m);
        $s = ' ' . implode(' ', $m[0]) . ' ';

        #убираем все повторяющиеся символы
        #"сллоооовоо   слово" -> "слово слово"
        $s = preg_replace('/(  [xd0xd1][x80-xbf]  #оптимизированное [а-я]
                         | [a-zd]
                         ) \1+
                       /sx', '$1', $s);
        #d($s);
        if (preg_match($re_badwords, $s, $m, PREG_OFFSET_CAPTURE)) {
            list($word, $offset) = $m[0];
            $s1 = substr($s, 0, $offset);
            $s2 = substr($s, $offset + strlen($word));
            $delta = intval($delta);
            if ($delta < 1 || $delta > 10)
                $delta = 3;
            preg_match('/  (?> x20 (?>[xd0xd1][x80-xbf]|[a-zd]+)+ ){1,' . $delta . '}
                       x20?
                    $/sx', $s1, $m1);
            preg_match('/^ (?>[xd0xd1][x80-xbf]|[a-zd]+)*  #окончание
                       x20?
                       (?> (?>[xd0xd1][x80-xbf]|[a-zd]+)+ x20 ){1,' . $delta . '}
                    /sx', $s2, $m2);
            $fragment = (ltrim(@$m1[0]) !== ltrim($s1) ? $continue : '') .
                    trim(@$m1[0] . '[' . trim($word) . ']' . @$m2[0]) .
                    (rtrim(@$m2[0]) !== rtrim($s2) ? $continue : '');
            return $fragment;
        }
        return false;
    }

    static function utf8_convert_case($s, $mode) {

        #таблица конвертации регистра
        static $trans = array(
            #CASE_UPPER => CASE_LOWER
            #en (английский латиница)
            "x41" => "x61", #a
            "x42" => "x62", #b
            "x43" => "x63", #c
            "x44" => "x64", #d
            "x45" => "x65", #e
            "x46" => "x66", #f
            "x47" => "x67", #g
            "x48" => "x68", #h
            "x49" => "x69", #i
            "x4a" => "x6a", #j
            "x4b" => "x6b", #k
            "x4c" => "x6c", #l
            "x4d" => "x6d", #m
            "x4e" => "x6e", #n
            "x4f" => "x6f", #o
            "x50" => "x70", #p
            "x51" => "x71", #q
            "x52" => "x72", #r
            "x53" => "x73", #s
            "x54" => "x74", #t
            "x55" => "x75", #u
            "x57" => "x77", #w
            "x56" => "x76", #v
            "x58" => "x78", #x
            "x59" => "x79", #y
            "x5a" => "x7a", #z
            #ru (русский кириллица)
            "xd0x81" => "xd1x91", #ё
            "xd0x90" => "xd0xb0", #а
            "xd0x91" => "xd0xb1", #б
            "xd0x92" => "xd0xb2", #в
            "xd0x93" => "xd0xb3", #г
            "xd0x94" => "xd0xb4", #д
            "xd0x95" => "xd0xb5", #е
            "xd0x96" => "xd0xb6", #ж
            "xd0x97" => "xd0xb7", #з
            "xd0x98" => "xd0xb8", #и
            "xd0x99" => "xd0xb9", #й
            "xd0x9a" => "xd0xba", #к
            "xd0x9b" => "xd0xbb", #л
            "xd0x9c" => "xd0xbc", #м
            "xd0x9d" => "xd0xbd", #н
            "xd0x9e" => "xd0xbe", #о
            "xd0x9f" => "xd0xbf", #п
            "xd0xa0" => "xd1x80", #р
            "xd0xa1" => "xd1x81", #с
            "xd0xa2" => "xd1x82", #т
            "xd0xa3" => "xd1x83", #у
            "xd0xa4" => "xd1x84", #ф
            "xd0xa5" => "xd1x85", #х
            "xd0xa6" => "xd1x86", #ц
            "xd0xa7" => "xd1x87", #ч
            "xd0xa8" => "xd1x88", #ш
            "xd0xa9" => "xd1x89", #щ
            "xd0xaa" => "xd1x8a", #ъ
            "xd0xab" => "xd1x8b", #ы
            "xd0xac" => "xd1x8c", #ь
            "xd0xad" => "xd1x8d", #э
            "xd0xae" => "xd1x8e", #ю
            "xd0xaf" => "xd1x8f", #я
            #tt (татарский, башкирский кириллица)
            "xd2x96" => "xd2x97", #ж с хвостиком    &#1174; => &#1175;
            "xd2xa2" => "xd2xa3", #н с хвостиком    &#1186; => &#1187;
            "xd2xae" => "xd2xaf", #y                &#1198; => &#1199;
            "xd2xba" => "xd2xbb", #h мягкое         &#1210; => &#1211;
            "xd3x98" => "xd3x99", #э                &#1240; => &#1241;
            "xd3xa8" => "xd3xa9", #o перечеркнутое  &#1256; => &#1257;
            #uk (украинский кириллица)
            "xd2x90" => "xd2x91", #г с хвостиком
            "xd0x84" => "xd1x94", #э зеркальное отражение
            "xd0x86" => "xd1x96", #и с одной точкой
            "xd0x87" => "xd1x97", #и с двумя точками
            #be (белорусский кириллица)
            "xd0x8e" => "xd1x9e", #у с подковой над буквой
            #tr,de,es (турецкий, немецкий, испанский, французский латиница)
            "xc3x84" => "xc3xa4", #a умляут          &#196; => &#228;  (турецкий)
            "xc3x87" => "xc3xa7", #c с хвостиком     &#199; => &#231;  (турецкий, французский)
            "xc3x91" => "xc3xb1", #n с тильдой       &#209; => &#241;  (турецкий, испанский)
            "xc3x96" => "xc3xb6", #o умляут          &#214; => &#246;  (турецкий)
            "xc3x9c" => "xc3xbc", #u умляут          &#220; => &#252;  (турецкий, французский)
            "xc4x9e" => "xc4x9f", #g умляут          &#286; => &#287;  (турецкий)
            "xc4xb0" => "xc4xb1", #i c точкой и без  &#304; => &#305;  (турецкий)
            "xc5x9e" => "xc5x9f", #s с хвостиком     &#350; => &#351;  (турецкий)
            #hr (хорватский латиница)
            "xc4x8c" => "xc4x8d", #c с подковой над буквой
            "xc4x86" => "xc4x87", #c с ударением
            "xc4x90" => "xc4x91", #d перечеркнутое
            "xc5xa0" => "xc5xa1", #s с подковой над буквой
            "xc5xbd" => "xc5xbe", #z с подковой над буквой
            #fr (французский латиница)
            "xc3x80" => "xc3xa0", #a с ударением в др. сторону
            "xc3x82" => "xc3xa2", #a с крышкой
            "xc3x86" => "xc3xa6", #ae совмещенное
            "xc3x88" => "xc3xa8", #e с ударением в др. сторону
            "xc3x89" => "xc3xa9", #e с ударением
            "xc3x8a" => "xc3xaa", #e с крышкой
            "xc3x8b" => "xc3xab", #ё
            "xc3x8e" => "xc3xae", #i с крышкой
            "xc3x8f" => "xc3xaf", #i умляут
            "xc3x94" => "xc3xb4", #o с крышкой
            "xc5x92" => "xc5x93", #ce совмещенное
            "xc3x99" => "xc3xb9", #u с ударением в др. сторону
            "xc3x9b" => "xc3xbb", #u с крышкой
            "xc5xb8" => "xc3xbf", #y умляут
                #xx (другой язык)
                #"" => "",  #
        );
        #d($trans);
        #вариант с str_replace() должен работать быстрее, чем с strtr()
        if ($mode == CASE_UPPER) {
            if (function_exists('mb_strtoupper')) {
                return mb_strtoupper($s, 'utf-8');
            }
            if (preg_match('/^[x00-x7e]*$/', $s)) {
                return strtoupper($s);
            }
            #может, так быстрее? (:TODO:)
            strtr($s, array_flip($trans));
            #$s = str_replace(array_values($trans), array_keys($trans), $s);
        } elseif ($mode == CASE_LOWER) {
            if (function_exists('mb_strtolower')) {
                return mb_strtolower($s, 'utf-8');
            }
            if (preg_match('/^[x00-x7e]*$/', $s)) {
                return strtolower($s);
            }
            #может, так быстрее? (:TODO:)
            strtr($s, $trans);
            #$s = str_replace(array_keys($trans), array_values($trans), $s);
        } else {
            trigger_error('Parameter 2 should be a constant of CASE_LOWER or CASE_UPPER!', E_USER_WARNING);
            return $s;
        }

        return $s;
    }

    static function utf8_lowercase($s) {
        return self::utf8_convert_case($s, CASE_LOWER);
    }

    static function utf8_uppercase($s) {
        return self::utf8_convert_case($s, CASE_UPPER);
    }

    static function utf8_html_entity_decode($s, $is_htmlspecialchars = false) {
        #оптимизация скорости
        if (strlen($s) < 4  #по минимальной длине сущности - 4 байта: &#d; &xx;
                || ($pos = strpos($s, '&') === false) || strpos($s, ';', $pos) === false)
            return $s;
        $table = array(
            #Latin-1 Entities:
            '&nbsp;' => "xc2xa0", #no-break space = non-breaking space
            '&iexcl;' => "xc2xa1", #inverted exclamation mark
            '&cent;' => "xc2xa2", #cent sign
            '&pound;' => "xc2xa3", #pound sign
            '&curren;' => "xc2xa4", #currency sign
            '&yen;' => "xc2xa5", #yen sign = yuan sign
            '&brvbar;' => "xc2xa6", #broken bar = broken vertical bar
            '&sect;' => "xc2xa7", #section sign
            '&uml;' => "xc2xa8", #diaeresis = spacing diaeresis
            '&copy;' => "xc2xa9", #copyright sign
            '&ordf;' => "xc2xaa", #feminine ordinal indicator
            '&laquo;' => "xc2xab", #left-pointing double angle quotation mark = left pointing guillemet («)
            '&not;' => "xc2xac", #not sign
            '&shy;' => "xc2xad", #soft hyphen = discretionary hyphen
            '&reg;' => "xc2xae", #registered sign = registered trade mark sign
            '&macr;' => "xc2xaf", #macron = spacing macron = overline = APL overbar
            '&deg;' => "xc2xb0", #degree sign
            '&plusmn;' => "xc2xb1", #plus-minus sign = plus-or-minus sign
            '&sup2;' => "xc2xb2", #superscript two = superscript digit two = squared
            '&sup3;' => "xc2xb3", #superscript three = superscript digit three = cubed
            '&acute;' => "xc2xb4", #acute accent = spacing acute
            '&micro;' => "xc2xb5", #micro sign
            '&para;' => "xc2xb6", #pilcrow sign = paragraph sign
            '&middot;' => "xc2xb7", #middle dot = Georgian comma = Greek middle dot
            '&cedil;' => "xc2xb8", #cedilla = spacing cedilla
            '&sup1;' => "xc2xb9", #superscript one = superscript digit one
            '&ordm;' => "xc2xba", #masculine ordinal indicator
            '&raquo;' => "xc2xbb", #right-pointing double angle quotation mark = right pointing guillemet (»)
            '&frac14;' => "xc2xbc", #vulgar fraction one quarter = fraction one quarter
            '&frac12;' => "xc2xbd", #vulgar fraction one half = fraction one half
            '&frac34;' => "xc2xbe", #vulgar fraction three quarters = fraction three quarters
            '&iquest;' => "xc2xbf", #inverted question mark = turned question mark
            #Latin capital letter
            '&Agrave;' => "xc3x80", #Latin capital letter A with grave = Latin capital letter A grave
            '&Aacute;' => "xc3x81", #Latin capital letter A with acute
            '&Acirc;' => "xc3x82", #Latin capital letter A with circumflex
            '&Atilde;' => "xc3x83", #Latin capital letter A with tilde
            '&Auml;' => "xc3x84", #Latin capital letter A with diaeresis
            '&Aring;' => "xc3x85", #Latin capital letter A with ring above = Latin capital letter A ring
            '&AElig;' => "xc3x86", #Latin capital letter AE = Latin capital ligature AE
            '&Ccedil;' => "xc3x87", #Latin capital letter C with cedilla
            '&Egrave;' => "xc3x88", #Latin capital letter E with grave
            '&Eacute;' => "xc3x89", #Latin capital letter E with acute
            '&Ecirc;' => "xc3x8a", #Latin capital letter E with circumflex
            '&Euml;' => "xc3x8b", #Latin capital letter E with diaeresis
            '&Igrave;' => "xc3x8c", #Latin capital letter I with grave
            '&Iacute;' => "xc3x8d", #Latin capital letter I with acute
            '&Icirc;' => "xc3x8e", #Latin capital letter I with circumflex
            '&Iuml;' => "xc3x8f", #Latin capital letter I with diaeresis
            '&ETH;' => "xc3x90", #Latin capital letter ETH
            '&Ntilde;' => "xc3x91", #Latin capital letter N with tilde
            '&Ograve;' => "xc3x92", #Latin capital letter O with grave
            '&Oacute;' => "xc3x93", #Latin capital letter O with acute
            '&Ocirc;' => "xc3x94", #Latin capital letter O with circumflex
            '&Otilde;' => "xc3x95", #Latin capital letter O with tilde
            '&Ouml;' => "xc3x96", #Latin capital letter O with diaeresis
            '&times;' => "xc3x97", #multiplication sign
            '&Oslash;' => "xc3x98", #Latin capital letter O with stroke = Latin capital letter O slash
            '&Ugrave;' => "xc3x99", #Latin capital letter U with grave
            '&Uacute;' => "xc3x9a", #Latin capital letter U with acute
            '&Ucirc;' => "xc3x9b", #Latin capital letter U with circumflex
            '&Uuml;' => "xc3x9c", #Latin capital letter U with diaeresis
            '&Yacute;' => "xc3x9d", #Latin capital letter Y with acute
            '&THORN;' => "xc3x9e", #Latin capital letter THORN
            #Latin small letter
            '&szlig;' => "xc3x9f", #Latin small letter sharp s = ess-zed
            '&agrave;' => "xc3xa0", #Latin small letter a with grave = Latin small letter a grave
            '&aacute;' => "xc3xa1", #Latin small letter a with acute
            '&acirc;' => "xc3xa2", #Latin small letter a with circumflex
            '&atilde;' => "xc3xa3", #Latin small letter a with tilde
            '&auml;' => "xc3xa4", #Latin small letter a with diaeresis
            '&aring;' => "xc3xa5", #Latin small letter a with ring above = Latin small letter a ring
            '&aelig;' => "xc3xa6", #Latin small letter ae = Latin small ligature ae
            '&ccedil;' => "xc3xa7", #Latin small letter c with cedilla
            '&egrave;' => "xc3xa8", #Latin small letter e with grave
            '&eacute;' => "xc3xa9", #Latin small letter e with acute
            '&ecirc;' => "xc3xaa", #Latin small letter e with circumflex
            '&euml;' => "xc3xab", #Latin small letter e with diaeresis
            '&igrave;' => "xc3xac", #Latin small letter i with grave
            '&iacute;' => "xc3xad", #Latin small letter i with acute
            '&icirc;' => "xc3xae", #Latin small letter i with circumflex
            '&iuml;' => "xc3xaf", #Latin small letter i with diaeresis
            '&eth;' => "xc3xb0", #Latin small letter eth
            '&ntilde;' => "xc3xb1", #Latin small letter n with tilde
            '&ograve;' => "xc3xb2", #Latin small letter o with grave
            '&oacute;' => "xc3xb3", #Latin small letter o with acute
            '&ocirc;' => "xc3xb4", #Latin small letter o with circumflex
            '&otilde;' => "xc3xb5", #Latin small letter o with tilde
            '&ouml;' => "xc3xb6", #Latin small letter o with diaeresis
            '&divide;' => "xc3xb7", #division sign
            '&oslash;' => "xc3xb8", #Latin small letter o with stroke = Latin small letter o slash
            '&ugrave;' => "xc3xb9", #Latin small letter u with grave
            '&uacute;' => "xc3xba", #Latin small letter u with acute
            '&ucirc;' => "xc3xbb", #Latin small letter u with circumflex
            '&uuml;' => "xc3xbc", #Latin small letter u with diaeresis
            '&yacute;' => "xc3xbd", #Latin small letter y with acute
            '&thorn;' => "xc3xbe", #Latin small letter thorn
            '&yuml;' => "xc3xbf", #Latin small letter y with diaeresis
            #Symbols and Greek Letters:
            '&fnof;' => "xc6x92", #Latin small f with hook = function = florin
            '&Alpha;' => "xcex91", #Greek capital letter alpha
            '&Beta;' => "xcex92", #Greek capital letter beta
            '&Gamma;' => "xcex93", #Greek capital letter gamma
            '&Delta;' => "xcex94", #Greek capital letter delta
            '&Epsilon;' => "xcex95", #Greek capital letter epsilon
            '&Zeta;' => "xcex96", #Greek capital letter zeta
            '&Eta;' => "xcex97", #Greek capital letter eta
            '&Theta;' => "xcex98", #Greek capital letter theta
            '&Iota;' => "xcex99", #Greek capital letter iota
            '&Kappa;' => "xcex9a", #Greek capital letter kappa
            '&Lambda;' => "xcex9b", #Greek capital letter lambda
            '&Mu;' => "xcex9c", #Greek capital letter mu
            '&Nu;' => "xcex9d", #Greek capital letter nu
            '&Xi;' => "xcex9e", #Greek capital letter xi
            '&Omicron;' => "xcex9f", #Greek capital letter omicron
            '&Pi;' => "xcexa0", #Greek capital letter pi
            '&Rho;' => "xcexa1", #Greek capital letter rho
            '&Sigma;' => "xcexa3", #Greek capital letter sigma
            '&Tau;' => "xcexa4", #Greek capital letter tau
            '&Upsilon;' => "xcexa5", #Greek capital letter upsilon
            '&Phi;' => "xcexa6", #Greek capital letter phi
            '&Chi;' => "xcexa7", #Greek capital letter chi
            '&Psi;' => "xcexa8", #Greek capital letter psi
            '&Omega;' => "xcexa9", #Greek capital letter omega
            '&alpha;' => "xcexb1", #Greek small letter alpha
            '&beta;' => "xcexb2", #Greek small letter beta
            '&gamma;' => "xcexb3", #Greek small letter gamma
            '&delta;' => "xcexb4", #Greek small letter delta
            '&epsilon;' => "xcexb5", #Greek small letter epsilon
            '&zeta;' => "xcexb6", #Greek small letter zeta
            '&eta;' => "xcexb7", #Greek small letter eta
            '&theta;' => "xcexb8", #Greek small letter theta
            '&iota;' => "xcexb9", #Greek small letter iota
            '&kappa;' => "xcexba", #Greek small letter kappa
            '&lambda;' => "xcexbb", #Greek small letter lambda
            '&mu;' => "xcexbc", #Greek small letter mu
            '&nu;' => "xcexbd", #Greek small letter nu
            '&xi;' => "xcexbe", #Greek small letter xi
            '&omicron;' => "xcexbf", #Greek small letter omicron
            '&pi;' => "xcfx80", #Greek small letter pi
            '&rho;' => "xcfx81", #Greek small letter rho
            '&sigmaf;' => "xcfx82", #Greek small letter final sigma
            '&sigma;' => "xcfx83", #Greek small letter sigma
            '&tau;' => "xcfx84", #Greek small letter tau
            '&upsilon;' => "xcfx85", #Greek small letter upsilon
            '&phi;' => "xcfx86", #Greek small letter phi
            '&chi;' => "xcfx87", #Greek small letter chi
            '&psi;' => "xcfx88", #Greek small letter psi
            '&omega;' => "xcfx89", #Greek small letter omega
            '&thetasym;' => "xcfx91", #Greek small letter theta symbol
            '&upsih;' => "xcfx92", #Greek upsilon with hook symbol
            '&piv;' => "xcfx96", #Greek pi symbol
            '&bull;' => "xe2x80xa2", #bullet = black small circle
            '&hellip;' => "xe2x80xa6", #horizontal ellipsis = three dot leader
            '&prime;' => "xe2x80xb2", #prime = minutes = feet (для обозначения минут и футов)
            '&Prime;' => "xe2x80xb3", #double prime = seconds = inches (для обозначения секунд и дюймов).
            '&oline;' => "xe2x80xbe", #overline = spacing overscore
            '&frasl;' => "xe2x81x84", #fraction slash
            '&weierp;' => "xe2x84x98", #script capital P = power set = Weierstrass p
            '&image;' => "xe2x84x91", #blackletter capital I = imaginary part
            '&real;' => "xe2x84x9c", #blackletter capital R = real part symbol
            '&trade;' => "xe2x84xa2", #trade mark sign
            '&alefsym;' => "xe2x84xb5", #alef symbol = first transfinite cardinal
            '&larr;' => "xe2x86x90", #leftwards arrow
            '&uarr;' => "xe2x86x91", #upwards arrow
            '&rarr;' => "xe2x86x92", #rightwards arrow
            '&darr;' => "xe2x86x93", #downwards arrow
            '&harr;' => "xe2x86x94", #left right arrow
            '&crarr;' => "xe2x86xb5", #downwards arrow with corner leftwards = carriage return
            '&lArr;' => "xe2x87x90", #leftwards double arrow
            '&uArr;' => "xe2x87x91", #upwards double arrow
            '&rArr;' => "xe2x87x92", #rightwards double arrow
            '&dArr;' => "xe2x87x93", #downwards double arrow
            '&hArr;' => "xe2x87x94", #left right double arrow
            '&forall;' => "xe2x88x80", #for all
            '&part;' => "xe2x88x82", #partial differential
            '&exist;' => "xe2x88x83", #there exists
            '&empty;' => "xe2x88x85", #empty set = null set = diameter
            '&nabla;' => "xe2x88x87", #nabla = backward difference
            '&isin;' => "xe2x88x88", #element of
            '&notin;' => "xe2x88x89", #not an element of
            '&ni;' => "xe2x88x8b", #contains as member
            '&prod;' => "xe2x88x8f", #n-ary product = product sign
            '&sum;' => "xe2x88x91", #n-ary sumation
            '&minus;' => "xe2x88x92", #minus sign
            '&lowast;' => "xe2x88x97", #asterisk operator
            '&radic;' => "xe2x88x9a", #square root = radical sign
            '&prop;' => "xe2x88x9d", #proportional to
            '&infin;' => "xe2x88x9e", #infinity
            '&ang;' => "xe2x88xa0", #angle
            '&and;' => "xe2x88xa7", #logical and = wedge
            '&or;' => "xe2x88xa8", #logical or = vee
            '&cap;' => "xe2x88xa9", #intersection = cap
            '&cup;' => "xe2x88xaa", #union = cup
            '&int;' => "xe2x88xab", #integral
            '&there4;' => "xe2x88xb4", #therefore
            '&sim;' => "xe2x88xbc", #tilde operator = varies with = similar to
            '&cong;' => "xe2x89x85", #approximately equal to
            '&asymp;' => "xe2x89x88", #almost equal to = asymptotic to
            '&ne;' => "xe2x89xa0", #not equal to
            '&equiv;' => "xe2x89xa1", #identical to
            '&le;' => "xe2x89xa4", #less-than or equal to
            '&ge;' => "xe2x89xa5", #greater-than or equal to
            '&sub;' => "xe2x8ax82", #subset of
            '&sup;' => "xe2x8ax83", #superset of
            '&nsub;' => "xe2x8ax84", #not a subset of
            '&sube;' => "xe2x8ax86", #subset of or equal to
            '&supe;' => "xe2x8ax87", #superset of or equal to
            '&oplus;' => "xe2x8ax95", #circled plus = direct sum
            '&otimes;' => "xe2x8ax97", #circled times = vector product
            '&perp;' => "xe2x8axa5", #up tack = orthogonal to = perpendicular
            '&sdot;' => "xe2x8bx85", #dot operator
            '&lceil;' => "xe2x8cx88", #left ceiling = APL upstile
            '&rceil;' => "xe2x8cx89", #right ceiling
            '&lfloor;' => "xe2x8cx8a", #left floor = APL downstile
            '&rfloor;' => "xe2x8cx8b", #right floor
            '&lang;' => "xe2x8cxa9", #left-pointing angle bracket = bra
            '&rang;' => "xe2x8cxaa", #right-pointing angle bracket = ket
            '&loz;' => "xe2x97x8a", #lozenge
            '&spades;' => "xe2x99xa0", #black spade suit
            '&clubs;' => "xe2x99xa3", #black club suit = shamrock
            '&hearts;' => "xe2x99xa5", #black heart suit = valentine
            '&diams;' => "xe2x99xa6", #black diamond suit
            #Other Special Characters:
            '&OElig;' => "xc5x92", #Latin capital ligature OE
            '&oelig;' => "xc5x93", #Latin small ligature oe
            '&Scaron;' => "xc5xa0", #Latin capital letter S with caron
            '&scaron;' => "xc5xa1", #Latin small letter s with caron
            '&Yuml;' => "xc5xb8", #Latin capital letter Y with diaeresis
            '&circ;' => "xcbx86", #modifier letter circumflex accent
            '&tilde;' => "xcbx9c", #small tilde
            '&ensp;' => "xe2x80x82", #en space
            '&emsp;' => "xe2x80x83", #em space
            '&thinsp;' => "xe2x80x89", #thin space
            '&zwnj;' => "xe2x80x8c", #zero width non-joiner
            '&zwj;' => "xe2x80x8d", #zero width joiner
            '&lrm;' => "xe2x80x8e", #left-to-right mark
            '&rlm;' => "xe2x80x8f", #right-to-left mark
            '&ndash;' => "xe2x80x93", #en dash
            '&mdash;' => "xe2x80x94", #em dash
            '&lsquo;' => "xe2x80x98", #left single quotation mark
            '&rsquo;' => "xe2x80x99", #right single quotation mark (and apostrophe!)
            '&sbquo;' => "xe2x80x9a", #single low-9 quotation mark
            '&ldquo;' => "xe2x80x9c", #left double quotation mark
            '&rdquo;' => "xe2x80x9d", #right double quotation mark
            '&bdquo;' => "xe2x80x9e", #double low-9 quotation mark
            '&dagger;' => "xe2x80xa0", #dagger
            '&Dagger;' => "xe2x80xa1", #double dagger
            '&permil;' => "xe2x80xb0", #per mille sign
            '&lsaquo;' => "xe2x80xb9", #single left-pointing angle quotation mark
            '&rsaquo;' => "xe2x80xba", #single right-pointing angle quotation mark
            '&euro;' => "xe2x82xac", #euro sign
        );
        $htmlspecialchars = array(
            '&quot;' => "x22", #quotation mark = APL quote (") &#34;
            '&amp;' => "x26", #ampersand                  (&) &#38;
            '&lt;' => "x3c", #less-than sign             (<) &#60;
            '&gt;' => "x3e", #greater-than sign          (>) &#62;
        );

        if ($is_htmlspecialchars)
            $table += $htmlspecialchars;

        #заменяем именованные сущности:
        #оптимизация скорости: заменяем только те сущности, которые используются в html коде!
        #эта часть кода работает быстрее, чем $s = strtr($s, $table);
        preg_match_all('/&[a-zA-Z]+d*;/s', $s, $m, null, $pos);
        foreach (array_unique($m[0]) as $entity) {
            if (array_key_exists($entity, $table))
                $s = str_replace($entity, $table[$entity], $s);
        }#foreach

        if (($pos = strpos($s, '&#')) !== false) {  #speed optimization
            #заменяем числовые dec и hex сущности:
            $htmlspecialchars_flip = array_flip($htmlspecialchars);
            $s = preg_replace(
                    '/&#((x)[da-fA-F]{2,4}|d{1,4});/se', '(array_key_exists($a = pack("C", $d = ("$2") ? hexdec("$1") : "$1"), $htmlspecialchars_flip) && ! $is_htmlspecialchars) ?
             $htmlspecialchars_flip[$a] :
             iconv("UCS-2BE", "UTF-8", pack("n", $d))', $s, -1, $pos);
        }
        return $s;
    }

    static function strip_tags_smart(
    /* string */ $s, array $allowable_tags = null,
    /* boolean */ $is_format_spaces = false, array $pair_tags = array('script', 'style', 'map', 'iframe', 'frameset', 'object', 'applet', 'comment', 'button'), array $para_tags = array('p', 'td', 'th', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'form', 'title')
    ) {
        static $_callback_type = false;
        static $_allowable_tags = array();
        static $_para_tags = array();
        #регулярное выражение для атрибутов тагов
        #корректно обрабатывает грязный и битый HTML в однобайтовой или UTF-8 кодировке!
        static $re_attrs_fast_safe = '(?> (?>[x20rnt]+|xc2xa0)+  #пробельные символы (д.б. обязательно)
                                       (?>
                                         #правильные атрибуты
                                                                        [^>"']+
                                         | (?<=[=x20rnt]|xc2xa0) "[^"]*"
                                         | (?<=[=x20rnt]|xc2xa0) '[^']*'
                                         #разбитые атрибуты
                                         |                              [^>]+
                                       )*
                                   )?';

        if (is_array($s) && $_callback_type === 'strip_tags') {
            $tag = strtolower($s[1]);
            if ($_allowable_tags &&
                    (array_key_exists($tag, $_allowable_tags) || array_key_exists('<' . trim(strtolower($s[0]), '< />') . '>', $_allowable_tags))
            )
                return $s[0];
            if ($tag == 'br')
                return "rn";
            if ($_para_tags && array_key_exists($tag, $_para_tags))
                return "rnrn";
            return '';
        }

        if (($pos = strpos($s, '<') === false) || strpos($s, '>', $pos) === false) {  #оптимизация скорости
            #таги не найдены
            return $s;
        }

        #непарные таги (открывающие, закрывающие, !DOCTYPE, MS Word namespace)
        $re_tags = '/<[/!]? ([a-zA-Z][a-zA-Zd]* (?>:[a-zA-Z][a-zA-Zd]*)?)' . $re_attrs_fast_safe . '/?>/sx';

        $patterns = array(
            '/<([?%]) .*? \1>/sx', #встроенный PHP, Perl, ASP код
            '/<![CDATA[ .*? ]]>/sx', #блоки CDATA
            #'/<![  [x20rnt]* [a-zA-Z] .*?  ]>/sx',  #:DEPRECATED: MS Word таги типа <![if! vml]>...<![endif]>
            '/<!--.*?-->/s', #комментарии
            #MS Word таги типа "<![if! vml]>...<![endif]>",
            #условное выполнение кода для IE типа "<!--[if expression]> HTML <![endif]-->"
            #условное выполнение кода для IE типа "<![if expression]> HTML <![endif]>"
            #см. http://www.tigir.com/comments.htm
            '/<! (?>--)?
              [
              (?> [^]"']+ | "[^"]*" | '[^']*' )*
              ]
              (?>--)?
         >/sx',
        );
        if ($pair_tags) {
            #парные таги вместе с содержимым:
            foreach ($pair_tags as $k => $v)
                $pair_tags[$k] = preg_quote($v, '/');
            $patterns[] = '/<((?i:' . implode('|', $pair_tags) . '))' . $re_attrs_fast_safe . '> .*? </(?i:\1)' . $re_attrs_fast_safe . '>/sx';
        }
        #d($patterns);

        $i = 0; #защита от зацикливания
        $max = 99;
        while ($i < $max) {
            $s2 = preg_replace($patterns, '', $s);
            if ($i == 0) {
                $is_html = ($s2 != $s || preg_match($re_tags, $s2));
                if ($is_html) {
                    #В библиотеке PCRE для PHP s - это любой пробельный символ, а именно класс символов [x09x0ax0cx0dx20xa0] или, по другому, [tnfr xa0]
                    #Если s используется с модификатором /u, то s трактуется как [x09x0ax0cx0dx20]
                    #Браузер не делает различия между пробельными символами,
                    #друг за другом подряд идущие символы воспринимаются как один
                    #$s = str_replace(array("r", "n", "t"), ' ', $s);
                    $s2 = strtr($s2, "x09x0ax0cx0d", '    ');

                    #массив тагов, которые не будут вырезаны
                    if ($allowable_tags)
                        $_allowable_tags = array_flip($allowable_tags);

                    #парные таги, которые будут восприниматься как параграфы
                    if ($para_tags)
                        $_para_tags = array_flip($para_tags);
                }
            }#if
            #обработка тагов
            if ($is_html) {
                $_callback_type = 'strip_tags';
                $s2 = preg_replace_callback($re_tags, __FUNCTION__, $s2);
                $_callback_type = false;
            }

            if ($s === $s2)
                break;
            $s = $s2;
            $i++;
        }#while
        if ($i >= $max)
            $s = strip_tags($s);#too many cycles for replace...

        if ($is_format_spaces || $is_html) {
            #вырезаем дублирующие пробелы
            $s = preg_replace('/x20x20+/s', ' ', trim($s));
            #вырезаем пробелы в начале и в конце строк
            $s = str_replace(array("rnx20", "x20rn"), "rn", $s);
            #заменяем 2 и более переносов строк на 2 переноса строк
            $s = preg_replace('/rn[rn]+/s', "rnrn", $s);
        }
        return $s;
    }

    #антимат сделает автоматическое предупреждение, а затем бан

    static function antimat($str) {
        global $user, $time, $set;
        if ($set['antimat']) {
            $antimat = empty($_SESSION['antimat']) ? null : $_SESSION['antimat'];
            $censure = self::censure($str);
            if ($censure) {
                $antimat[$censure] = $time;
                if (count($antimat) > 3 and isset($user) and $user['level'] == 0) { #если сделано больше 3-х предупреждений
                    $prich = "Обнаружен мат: $censure";
                    $timeban = $time + 60 * 60; // бан на час
                    mysql_query("INSERT INTO `ban` (`id_user`, `id_ban`, `prich`, `time`) VALUES ('$user[id]', '0', '$prich', '$timeban')");
                    admin_log('Пользователи', 'Бан', "Бан пользователя '[url=/panel/ban.php?id=$user[id]]$user[nick][/url]' (id#$user[id]) до " . date::time($timeban) . " по причине '$prich'");
                    header('Location: /ban.php?' . SID);
                    exit;
                }
                return $censure;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    static function extract16color($color16) {
        $mask16 = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
        $color_mask = array("r", "g", "b");
        $true_color = array(
            "r" => 0,
            "g" => 0,
            "b" => 0);
        $color16 = substr($color16, 1);
        for ($icm = 0; $icm < count($color_mask); $icm++) {
            $color16_temp = array(substr($color16, ($icm * 2), 1), substr($color16, ($icm * 2) + 1, 1));
            for ($ic = 0; $ic < 2; $ic++) {
                for ($i = 0; $i < count($mask16); $i++) {
                    if ($color16_temp[$ic] == $mask16[$i]) {
                        $color16_temp[$ic] = $i;
                        break;
                    }
                }
            }
            $true_color[$color_mask[$icm]] = ((int) $color16_temp[0] * 16) + (int) $color16_temp[1];
        }
        return $true_color;
    }

    static function make16color($color10) {
        $mask16 = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
        $color_mask = array("r", "g", "b");
        $true_color = "#";
        for ($icm = 0; $icm < count($color_mask); $icm++) {
            $color10_temp = (int) $color10[$color_mask[$icm]];
            $true_color .= $mask16[(int) ($color10_temp / 16)];
            $true_color .= $mask16[$color10_temp % 16];
        }
        return $true_color;
    }

    static function gradient($text, $sColor, $eColor) {
        $color_mask = array("r", "g", "b");
        $color_move = array(
            "r" => 0,
            "g" => 0,
            "b" => 0);
        $color_add = array(
            "r" => 0,
            "g" => 0,
            "b" => 0);
        $word = array();
        $length = strlen($text);
        $output = "";
        $Gzip = "";
        $current_color = "";
        $max = 0;
        if ($length > 0) {
            $sColor = self::extract16color($sColor);
            $eColor = self::extract16color($eColor);
            $cColor = $sColor;
            for ($i = 0; $i < count($color_mask); $i++) {
                $temp = $sColor[$color_mask[$i]] - $eColor[$color_mask[$i]];
                $color_add[$color_mask[$i]] = abs($temp);
                if (abs($temp) > $max) {
                    $max = abs($temp);
                }
                if ($temp < 0) {
                    $color_move[$color_mask[$i]] = 1;
                } else if ($temp > 0) {
                    $color_move[$color_mask[$i]] = - 1;
                } else {
                    $color_move[$color_mask[$i]] = 0;
                }
            }
            for ($i = 0; $i < $length; $i++) {
                $char = substr($text, $i, 1);
                $test = ord($char);
                if ($test >= 128 and $test <= 255 | $test = "") {
                    $char = substr($text, $i, 2);
                    $i++;
                }
                $word[] = $char;
            }
        }

        $length = count($word);
        $koeff_add = @(($max / $length) / $max) * 100;
        for ($i = 0; $i < $length; $i++) {
            for ($i2 = 0; $i2 < count($color_mask); $i2++) {
                $add = (($color_add[$color_mask[$i2]] / 100) * $koeff_add) * $color_move[$color_mask[$i2]];
                $cColor[$color_mask[$i2]] += $add;
            }
            $current_color = self::make16color($cColor);
            if (!$i) {
                $output .= '<font color = "' . $current_color . '">' . $word[$i];
                $Gzip = $current_color;
            } else {
                if ($current_color == $Gzip | $word[$i] == " ") {
                    $output .= $word[$i];
                } else {
                    $output .= '</font><font color = "' . $current_color . '">' . $word[$i];
                    $Gzip = $current_color;
                }
            }
        }
        if (strlen($output)) {
            $output .= "</font>";
        }
        return $output;
    }

    static function smiles($msg) {
        $q = mysql_query("SELECT * FROM `smiles_spis`");
        while ($post = mysql_fetch_array($q)) {
            $msg = str_replace($post['sim'], "<img src = '/style/icons/smiles/$post[name].png' alt = '$post[name]' />", $msg);
        }
        return $msg;
    }

    static function cut_text($text, $maxwords = 10, $maxchar = 30) {
        $sep = ' ';
        $words = @preg_split(" ", $text);
        $char = iconv_strlen($text, 'utf-8');
        if (count($words) > $maxwords) {
            $text = join($sep, array_slice($words, 0, $maxwords));
        }
        return $text;
    }

    #Получение подстроки

    static function substr($text, $len, $start = 0, $mn = ' (...)') {
        $text = trim($text);
        if (function_exists('mb_substr')) {
            return mb_substr($text, $start, $len) . (mb_strlen($text) > $len - $start ? $mn : null);
        }
        if (function_exists('iconv')) {
            return iconv_substr($text, $start, $len) . (iconv_strlen($text) > $len - $start ? $mn : null);
        }

        return $text;
    }

#Фильтрация текста с ограничением длины в зависимости от типа браузера.

    static function for_opis($text) {
        $text = self::substr($text, IS_WEB == 'web' ? 1000 : 300);
        $text = self::toOutput($text);

        return $text;
    }

    static function toOutput($str, $br = 1, $html = 1, $smiles = 1, $links = 1, $bbcode = 1) {

        // преобразуем все к нормальному перевариванию браузером
        if ($html) {
            $str = htmlentities($str, ENT_QUOTES, 'UTF-8');
        }

        // вставка смайлов
        if ($smiles) {
            $str = self::smiles($str);
        }

        // обработка ссылок
        if ($links) {
            $str = links($str);
        }

        // обработка bbcode
        if ($bbcode) {
            $tmp_str = $str;
            $str = bbcode($str);
        }
        // переносы строк
        if ($br) {
            $str = self::br($str);
        }

        $str = self::output_add($str);

        // возвращаем обработанную строку
        return stripslashes($str);
    }

    #вспомогательная функция дополнительных фильтраций текста

    static function output_add($text) {

        //байт разворота
        $text = str_replace(chr(226) . chr(128) . chr(174), '.', $text);

        //одна из не очень популярных xss но считается давольно вредной
        $text = str_replace(array('̏', '͓'), null, $text);

        return $text;
    }

# переносы строк

    static function br($msg, $br = '<br />') {
        return preg_replace("#((<br( ?/?)>)|n|r)+#i", $br, $msg);
    }

# Вырезает все нечитаемые символы

    static function esc($text, $br = NULL) {
        if ($br != NULL) {
            for ($i = 0; $i <= 31; $i++) {
                $text = str_replace(chr($i), NULL, $text);
            }
        } else {
            for ($i = 0; $i < 10; $i++) {
                $text = str_replace(chr($i), NULL, $text);
            }
            for ($i = 11; $i < 20; $i++) {
                $text = str_replace(chr($i), NULL, $text);
            }
            for ($i = 21; $i <= 31; $i++) {
                $text = str_replace(chr($i), NULL, $text);
            }
        }
        return $text;
    }

    static function auto_bb($form, $field) {
        global $bb_start;
        $out = '';
        if (!$bb_start) {
            $out = '<script language="JavaScript" type="text/javascript">;
    function tag(text1, text2) {
    if ((document.selection)) {
    document.' . $form . '.' . $field . '.focus();
    document.' . $form . '.document.selection.createRange().text = text1+document.' . $form . '.document.selection.createRange().text+text2;
    } else if(document.forms['' . $form . ''].elements['' . $field . ''].selectionStart!=undefined) {
    var element = document.forms['' . $form . ''].elements['' . $field . ''];
    var str = element.value;
    var start = element.selectionStart;
    var length = element.selectionEnd - element.selectionStart;
    element.value = str.substr(0, start) + text1 + str.substr(start, length) + text2 + str.substr(start + length);
    document.forms['' . $form . ''].elements['' . $field . ''].focus();
    } else document.' . $form . '.' . $field . '.value += text1+text2;
    document.forms['' . $form . ''].elements['' . $field . ''].focus();}</script>';
            $bb_start = 1;
        }
        return $out . '<div style="margin:1px;padding:2px;">
    <a href="javascript:tag('[b]', '[/b]')"><img src="/style/icons/bb/b.png" alt="b" title="Жирный"/></a>
    <a href="javascript:tag('[i]', '[/i]')"><img src="/style/icons/bb/i.png" alt="i" title="Наклонный"/></a>
    <a href="javascript:tag('[u]', '[/u]')"><img src="/style/icons/bb/u.png" alt="u" title="Подчёркнутый"/></a>
    <a href="javascript:tag('[s]', '[/s]')"><img src="/style/icons/bb/s.png" alt="s" title="Перечёркнутый"/></a>
    <a href="javascript:tag('[php]', '[/php]')"><img src="/style/icons/bb/php.png" alt="cod" title="Код"/></a>
    <a href="javascript:tag('[url=]', '[/url]')"><img src="/style/icons/bb/l.png" alt="url" title="Ссылка" /></a>
    <a href="javascript:tag('[red]', '[/red]')"><img src="/style/icons/bb/red.png" alt="red" title="Красный"/></a>
    <a href="javascript:tag('[green]', '[/green]')"><img src="/style/icons/bb/green.png" alt="green" title="Зелёный"/></a>
    <a href="javascript:tag('[blue]', '[/blue]')"><img src="/style/icons/bb/blue.png" alt="blue" title="Синий"/></a><br />
    </div>';
    }

    #получение кол-ва символов строки 

    static function utf8_strlen($str) {
        if (function_exists('mb_substr')) {
            return mb_strlen($str);
        }
        if (function_exists('iconv')) {
            return iconv_strlen($str);
        } else {
#извращенный способ при отсутствии библиотек
            static $rus;
            if (!isset($rus)) {
                $rus = array('й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', 'Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'Э', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю');
            }
            return strlen(str_replace($rus, '0', $str));
        }
    }

#Получение подстроки

    static function utf8_substr($str, $len, $dot = 1, $start = 0) {
        if (self::utf8_strlen($str) > $len) {
            if (function_exists('mb_substr')) {
                $str = mb_substr($str, $start, $len);
            }
            if (function_exists('iconv')) {
                $str = iconv_substr($str, $start, $len);
            } else {
                $out = substr($str, $start, $len);
            } // могут появиться нечитаемые символы
            if ($dot) {
                $str.=' ...';
            }
        }
        return $str;
    }

    #Транслитерация русского текста в английский

    static function translit($string) {
        $table = array(
            'А' => 'A',
            'Б' => 'B',
            'В' => 'V',
            'Г' => 'G',
            'Ґ' => 'G',
            'Д' => 'D',
            'Е' => 'E',
            'Є' => 'YE',
            'Ё' => 'YO',
            'Ж' => 'ZH',
            'З' => 'Z',
            'И' => 'I',
            'І' => 'I',
            'Ї' => 'YI',
            'Й' => 'J',
            'К' => 'K',
            'Л' => 'L',
            'М' => 'M',
            'Н' => 'N',
            'О' => 'O',
            'П' => 'P',
            'Р' => 'R',
            'С' => 'S',
            'Т' => 'T',
            'У' => 'U',
            'Ў' => 'U',
            'Ф' => 'F',
            'Х' => 'H',
            'Ц' => 'C',
            'Ч' => 'CH',
            'Ш' => 'SH',
            'Щ' => 'CSH',
            'Ь' => '',
            'Ы' => 'Y',
            'Ъ' => '',
            'Э' => 'E',
            'Ю' => 'YU',
            'Я' => 'YA',
            'а' => 'a',
            'б' => 'b',
            'в' => 'v',
            'г' => 'g',
            'ґ' => 'g',
            'д' => 'd',
            'е' => 'e',
            'є' => 'ye',
            'ё' => 'yo',
            'ж' => 'zh',
            'з' => 'z',
            'и' => 'i',
            'і' => 'i',
            'ї' => 'yi',
            'й' => 'j',
            'к' => 'k',
            'л' => 'l',
            'м' => 'm',
            'н' => 'n',
            'о' => 'o',
            'п' => 'p',
            'р' => 'r',
            'с' => 's',
            'т' => 't',
            'у' => 'u',
            'ў' => 'u',
            'ф' => 'f',
            'х' => 'h',
            'ц' => 'c',
            'ч' => 'ch',
            'ш' => 'sh',
            'щ' => 'csh',
            'ь' => '',
            'ы' => 'y',
            'ъ' => '',
            'э' => 'e',
            'ю' => 'yu',
            'я' => 'ya',
        );
        return str_replace(array_keys($table), array_values($table), $string);
    }

    static function retranslit($in) {
        $trans1 = array("'", '`', ',', ' ', "Ё", "Ж", "Ч", "Ш", "Щ", "Э", "Ю", "Я", "ё", "ж", "ч", "ш", "щ", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ь", "Ы", "а", "б", "в", "г", "д", "е", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ь", "ы");
        $trans2 = array('_', '_', '_', '_', "JO", "ZH", "CH", "SH", "SCH", "Je", "Jy", "Ja", "jo", "zh", "ch", "sh", "sch", "je", "jy", "ja", "A", "B", "V", "G", "D", "E", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "C", "", "Y", "a", "b", "v", "g", "d", "e", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "", "y");
        return str_replace($trans1, $trans2, $in);
    }

    static function tr_loads($in) {
        return preg_replace('#[^A-z0-9_-.()]+#ui', '_', $in);
    }

}
Онлайн: 2
Реклама