Вход Регистрация
Файл: sys/fnc/censure.php
Строк: 45
<?php

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 strip_tags_smart($snulltrue, array('comment''style''map''frameset''object''applet'));
    
#заменяем html-сущности в "чистый" UTF-8
    
$s utf8_html_entity_decode($s$is_htmlspecialchars true);
    
$s 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;
}
Онлайн: 1
Реклама