За последние 24 часа нас посетили 17918 программистов и 1614 роботов. Сейчас ищут 1447 программистов ...

Матофильтр

Тема в разделе "Решения, алгоритмы", создана пользователем admyx, 2 дек 2008.

  1. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Вот, написал для своего проекта матофильтр.....
    Собственно, вопрос - насколько громоздок и юзабелен?
    Писалось "на коленке", так что строго не судите.

    Предназначен для работы с массивами $_POST, $_GET, $_REQUEST.
    Имеет два типа совпадений - полное, либо частичное.


    Код класса:
    PHP:
    1.  
    2.  
    3. <?php
    4.  
    5. class Badwords
    6. {
    7.     /**
    8.      * Array for checking... May be $_POST or $_GET or $_REQUEST....
    9.      *
    10.      * @var array
    11.      */
    12.     var $check_words = array();
    13.    
    14.     /**
    15.      * Arrays with badwords.
    16.      *
    17.      * @var array
    18.      */
    19.     var $badwords_full = array(); //polnoe sovpadenie
    20.     var $badwords_nonfull = array(); //chastichnoe sovpadenie
    21.    
    22.    
    23.     function check()
    24.     {
    25.         //---------------------------------------------
    26.         //  Unset not needed vars
    27.         //---------------------------------------------
    28.         if(isset($this->check_words['imagefile']))
    29.                     unset($this->check_words['imagefile']);
    30.         if(isset($this->check_words['file']))
    31.                     unset($this->check_words['file']);
    32.         if(isset($this->check_words['captcha']))
    33.                     unset($this->check_words['submit']);       
    34.         if(isset($this->check_words['submit']))
    35.                     unset($this->check_words['submit']);
    36.                    
    37.         $dress_string = implode(',',$this->check_words); //create string from array
    38.         strtolower($dress_string); //all sybmols to low register
    39.         $replace = preg_replace("/[0-9]+/", '', $dress_string); //delete nums
    40.         preg_match_all('/([а-яa-zA-ZА-Я]+)/u',$replace,$only_words); //get words_array
    41.  
    42.         if(!isset($only_words[0]) || empty($only_words[0]))
    43.                 return false; //if WORDS_ARRAY is empty
    44.                
    45.         $debug_words = array(); //returned array, where will be utilize bad words
    46.        
    47.         //----------------------------------------------
    48.         // Checking for FULL compare .etc. SIKSI=SISKI
    49.         //----------------------------------------------
    50.  
    51.         foreach($only_words[0] as $key=>$value)
    52.         {
    53.         $res[]=$value;
    54.         }
    55.  
    56.         for($x=0;$x<count($this->badwords_full);$x++)
    57.         {
    58.             $data = array_search($this->badwords_full[$x]['word'], $res);
    59.            
    60.             if(isset($data) && is_numeric($data))
    61.             {
    62.             $debug_words[] = $this->badwords_full[$x]['word'];
    63.             }
    64.         }
    65.        
    66.         $check_string = implode(', ', $only_words[0]);
    67.         //----------------------------------------------
    68.         // Checking for non-FULL compare .etc. SIKSI=**SKI
    69.         //----------------------------------------------
    70.         for($x=0;$x<count($this->badwords_nonfull);$x++)
    71.         {
    72.             preg_match_all('/^.*('.$this->badwords_nonfull[$x]['word'].').*$/ui', $check_string, $matches[]);
    73.         }
    74.        
    75.         for($i=0;$i<count($matches);$i++)
    76.         {
    77.             foreach($matches[$i][0] as $key => $value)
    78.             {
    79.             if(isset($value) && !empty($value))
    80.                 $debug_words[] = $value;
    81.             }
    82.         }  
    83.  
    84.         return $debug_words;
    85.     }
    86. }
    87. ?>
    88.  
    89.  
    Дамп БД

    [sql]
    -- ----------------------------
    -- Table structure for site_badwords
    -- ----------------------------
    DROP TABLE IF EXISTS `site_badwords`;
    CREATE TABLE `site_badwords` (
    `id` int(11) NOT NULL auto_increment,
    `word` varchar(255) NOT NULL,
    `sovpadenie` tinyint(4) default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    -- ----------------------------
    -- Records
    -- ----------------------------
    INSERT INTO `site_badwords` VALUES ('1', 'член', '0');
    INSERT INTO `site_badwords` VALUES ('3', 'девочки', '1');
    INSERT INTO `site_badwords` VALUES ('4', 'шлюх', '0');
    INSERT INTO `site_badwords` VALUES ('5', 'порно', '1');
    INSERT INTO `site_badwords` VALUES ('6', 'смерт', '0');
    INSERT INTO `site_badwords` VALUES ('8', 'капец', '1');[/sql]

    Применение (с абстрактными переменными)
    PHP:
    1.  
    2. <?php
    3.                 //---------------------------------
    4.         // Checking for the badwords...
    5.         //---------------------------------
    6.         $badwords_check = new Badwords();
    7.  
    8.         $badwords_check->check_words = $_POST; //определяем массив для проверки
    9.  
    10.         //check for bad_words
    11.         $q = 'SELECT word FROM site_badwords WHERE (sovpadenie = 0 OR sovpadenie is null)';
    12.         $r = $db->query($q);
    13.         while($s = $db->fetchrow($r))
    14.             $badwords_nonfull[] = $s; //getting badwords array - with non-FULL compare
    15.         $db->freeresult($r);
    16.         $badwords_check->badwords_nonfull = $badwords_nonfull; //получаем список слов с частичным совпадением
    17.  
    18.         $q = 'SELECT word FROM site_badwords WHERE sovpadenie = 1';
    19.         $r = $db->query($q);
    20.         while($s = $db->fetchrow($r))
    21.             $badwords_full[] = $s; //getting badwords array - with FULL compare
    22.         $db->freeresult($r);
    23.         $badwords_check->badwords_full = $badwords_full; // слова с полным совпадением
    24.  
    25.         $debug_words = $badwords_check->check(); //проверяем
    26.        
    27.         if(isset($debug_words) && !empty($debug_words))  //если массив с плохими словами не пуст, т.е. "плохие" слова были введены
    28.         {
    29.        
    30.             foreach($debug_words as $badword)
    31.             {
    32.                 $template->cycle_vars('badwords', array(
    33.                         'WORD'      =>  '- '.$badword
    34.                             ));
    35.             }
    36.             $template->vars(array('ERROR'   =>  'Вы ввели слова, использование которых, в целях противодействия спамерам, запрещено в разделе объявлений. Список введенных Вами запрещенных слов Вы можете увидеть ниже:'));
    37.             $template->file='add_obyav.html';
    38.             $template->run();
    39.             exit();
    40.         }
    41. ?>
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Два года назад делал матофильтр для сетевого сайта:
    PHP:
    1. <?php
    2. $mat = array('лох','дурак','идиот','сосунок','тупой','бот','ебана','хер','блин','блин','хрен','пидар','ебало','хуйня','ебануться','фиг','капец');
    3.     $text = explode(" ", strtolower($_POST['textik']));
    4.     $result = array_intersect($mat, $text);
    5.     if (!$result){
    6.         echo "<script type='text/javascript'>
    7.                     alert('Похвально');
    8.                     </script>
    9.                     <meta http-equiv='Refresh' content='0;URL=index.php'>
    10.                     <a href='index.php'>Назад</a>";
    11.     }
    12.     else {
    13.         echo "<script type='text/javascript'>
    14.                 alert('Иди-ка ты..');
    15.                 </script>
    16.                 <meta http-equiv='Refresh' content='0;URL=http://lleo.aha.ru/na/'>
    17.                 <a href='http://lleo.aha.ru/na/'>Назад</a>";
    18.     }
    19. ?>

    P.S. Какой смысл делать класс с одним методом?

    UPD: Странно, куда-то делся скрипт с бОльшим "словарем".
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    у Котерова, если не ошибаюсь, встречал очень хороший (по описанию) матофильтр. Он пропустит слово рубля и корабля, но не пустит блин и №ля.
     
  4. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Эм..... У меня вопрос был про матофильтр, который я написал....
     
  5. kostyl

    kostyl Guest

    admyx
    сложновато довольно, да и пора уже пятерашным шрифтом писать, да и вообще причем тут класс - это делаестя функцией, для этого не надо делать класс.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    o_0
    Вот вам пример неоправданного использования ООП.
     
  7. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    А также баз данных...
    *представляет себе удобный интерфейс для управления списком и контент-менеджера, с любовью занимающегося им*