Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Класс фильтра мата UTF8 -> cp1251
 
 автор: maxfade   (01.09.2011 в 15:14)   письмо автору
 
 

Подскажите как данный класс переделать под cp1251?

Что не пытаюсь делать, ничего не получается...

class SwearFilter 
{
    
    /**
     * Hold transliteration table (english set)
     * 
     * @var array
     */
    static private $translitTableFrom = array(
        'a', 'b', 'v', 'g', 'd', 'e', 'g', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p',
        'r', 's', 't', 'u', 'f', 'i', 'e', 'A', 'B', 'V', 'G', 'D', 'E', 'G', 'Z', 'I',
        'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'I', 'E', 'yo', 'h',
        'ts', 'ch', 'sh', 'shch', 'yu', 'ya', 'YO', 'H', 'TS', 'CH', 'SH', 'SHCH', 'YU', 'YA'
    );

    /**
     * Hold transliteration table (russian set)
     * 
     * @var array
     */
    static private $translitTableTo = array(
        'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п',
        'р', 'с', 'т', 'у', 'ф', 'ы', 'э', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И',
        'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Ы', 'Э', 'ё', 'х',
        'ц', 'ч', 'ш', 'щ', 'ю', 'я', 'Ё', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ю', 'Я'
    );
    
    /**
     * Bad words array of string in preg_match regexp's compatibile format. You must manualy assign 
     * regexp's delimiters, modifier for matching string start/end. Also don`t forget to use PCRE8
     * modifier (http://ru2.php.net/manual/en/reference.pcre.pattern.modifiers.php).
     *    
     * @var array 
     */
    static private $badWords = array(
        "/^.*ху(й|и|я|е|л(и|е|ё))*.*/u", "/^.*пи(з|с)(д|ж).*/u", "/^бля.*/u", "/^.*бля(д|т|ц).*/u", 
        "/^(с|сц)ук(а|о|и).*/u", "/^(:|_|-|вы|)еб(а|ок|ли|у|и|ен|еня).*/u", "/^об(ъ).*/u", "/^.*уеб.*/u", "/^заеб.*/u", "/^.*еб(а|и)(н|с|щ|ц).*/u", 
        "/^.*ебу(ч|щ).*/u", "/^.*п(и|ы)д(о|е)р.*/u", "/^.*хер.*/u", "/^г(а|о)ндон/u", "/^.*залуп.*/u", "/^.*(ё|е)б(н|к|с).*/u", "/^.*(ё|е)б(а|ы).*/u"
        , "/^.*(ё)б.*/u", "/^(ипаться|ниипет|хрена|нехира|кондом|нах|пох|йух)/u",  "/^.*п(е|и)д(и|е|р|ар|ок).*/u",  "/^.*муд(ак|и|о).*/u",
          "/^м(а|о)н(да)/u",
    );
    
    /**
     * Use it to filtrate input string for swear words. During filtration all swear words replaced
     * by '*' symbol. 
     *
     * @param string $string Source string
     * @return string Filtered string with swear replaced by '*' symbol.
     */
    public function filter($string)
    {
        
        $swearingFound = false; 
        //here we explode string to words
        $elems = explode (" ", $string); 
        $count_elems = count($elems);
        
        for ($i = 0; $i < $count_elems; $i++) {
            //Transliterate alnum filterter string. We can`t use strtr due to UTF8.
            $str_rep = str_replace(self::$translitTableFrom,self::$translitTableTo,
                preg_replace('/[^a-zA-Zа-яА-Яё]/u', '', mb_strtolower($elems[$i], 'UTF8'))
            );
                        
            //Here we are trying to find bad word matching in the special array
            $countBadWords = count(self::$badWords);
            for ($k = 0; $k < $countBadWords; $k++) {
                if (preg_match(self::$badWords[$k], $str_rep)) {
                    $elems[$i] = str_repeat('*', mb_strlen($elems[$i], 'UTF8') - 1);
                    $swearingFound = true;
                    break;
                }
            }
        }
        
        //here we implode words in the whole string
        if ($swearingFound) {
            $string = implode (" ", $elems);
        }
        
        return $string;
    }
}

  Ответить  
 
 автор: cheops   (01.09.2011 в 15:50)   письмо автору
 
   для: maxfade   (01.09.2011 в 15:14)
 

Хм... может проще преобразовать в UTF-8 проверяемую строку (не на совсем, а лишь для проверки)?

  Ответить  
 
 автор: maxfade   (01.09.2011 в 16:50)   письмо автору
 
   для: cheops   (01.09.2011 в 15:50)
 

Вся проблема в том, что файл в котором все это находиться сохранен в кодировке ANSI и не подразумевает использование UTF-8.

Написал свой упрощенный варинат...

function anti_mate($string)
{
    $bad_word = array("/ху(й|и|я|е|л(и|е|ё))/si","/пи(з|с)(д|ж)/si","/бля/si","/бля(д|т|ц)/si","/(с|сц)ук(а|о|и)/si","/(:|_|-|вы|)еб(а|ок|ли|у|и|ен|еня)/si","/об(ъ)/si","/уеб/si","/заеб/si","/еб(а|и)(н|с|щ|ц)/si","/ебу(ч|щ)/si","/п(и|ы)д(о|е)р/si","/хер/si","/г(а|о)ндон/si","/залуп/si","/(ё|е)б(н|к|с)/si","/(ё|е)б(а|ы)/si","/(ё)б/si","/(ипаться|ниипет|хрена|нехира|кондом|нах|пох|йух)/si","/п(е|и)д(и|е|р|ар|ок)/si","/муд(ак|и|о)/si","/м(а|о)н(да)/si");

    setlocale(LC_ALL, "ru_RU.CP1251");

    $arr = explode(" ",$string);
    if(is_array($arr) AND isset($bad_word)) 
    { 
        foreach ($arr AS $v) 
        {
            $error = 0;
            for($i=0;$i<count($bad_word);$i++)
            {
                if(preg_match($bad_word[$i],mb_strtolower($v))) $error++;
            }
            if($error>0) $val[] = preg_replace($bad_word,"***",mb_strtolower($v)); 
            else $val[] = $v;
        }
        
        return implode(" ",$val);
    }    
}


Вроде все работает как надо, кому надо забирайте :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования