Вот, написал для своего проекта матофильтр..... Собственно, вопрос - насколько громоздок и юзабелен? Писалось "на коленке", так что строго не судите. Предназначен для работы с массивами $_POST, $_GET, $_REQUEST. Имеет два типа совпадений - полное, либо частичное. Код класса: PHP: <?php class Badwords { /** * Array for checking... May be $_POST or $_GET or $_REQUEST.... * * @var array */ var $check_words = array(); /** * Arrays with badwords. * * @var array */ var $badwords_full = array(); //polnoe sovpadenie var $badwords_nonfull = array(); //chastichnoe sovpadenie function check() { //--------------------------------------------- // Unset not needed vars //--------------------------------------------- if(isset($this->check_words['imagefile'])) unset($this->check_words['imagefile']); if(isset($this->check_words['file'])) unset($this->check_words['file']); if(isset($this->check_words['captcha'])) unset($this->check_words['submit']); if(isset($this->check_words['submit'])) unset($this->check_words['submit']); $dress_string = implode(',',$this->check_words); //create string from array strtolower($dress_string); //all sybmols to low register $replace = preg_replace("/[0-9]+/", '', $dress_string); //delete nums preg_match_all('/([а-яa-zA-ZА-Я]+)/u',$replace,$only_words); //get words_array if(!isset($only_words[0]) || empty($only_words[0])) return false; //if WORDS_ARRAY is empty $debug_words = array(); //returned array, where will be utilize bad words //---------------------------------------------- // Checking for FULL compare .etc. SIKSI=SISKI //---------------------------------------------- foreach($only_words[0] as $key=>$value) { $res[]=$value; } for($x=0;$x<count($this->badwords_full);$x++) { $data = array_search($this->badwords_full[$x]['word'], $res); if(isset($data) && is_numeric($data)) { $debug_words[] = $this->badwords_full[$x]['word']; } } $check_string = implode(', ', $only_words[0]); //---------------------------------------------- // Checking for non-FULL compare .etc. SIKSI=**SKI //---------------------------------------------- for($x=0;$x<count($this->badwords_nonfull);$x++) { preg_match_all('/^.*('.$this->badwords_nonfull[$x]['word'].').*$/ui', $check_string, $matches[]); } for($i=0;$i<count($matches);$i++) { foreach($matches[$i][0] as $key => $value) { if(isset($value) && !empty($value)) $debug_words[] = $value; } } return $debug_words; } } ?> Дамп БД [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: <?php //--------------------------------- // Checking for the badwords... //--------------------------------- $badwords_check = new Badwords(); $badwords_check->check_words = $_POST; //определяем массив для проверки //check for bad_words $q = 'SELECT word FROM site_badwords WHERE (sovpadenie = 0 OR sovpadenie is null)'; $r = $db->query($q); while($s = $db->fetchrow($r)) $badwords_nonfull[] = $s; //getting badwords array - with non-FULL compare $db->freeresult($r); $badwords_check->badwords_nonfull = $badwords_nonfull; //получаем список слов с частичным совпадением $q = 'SELECT word FROM site_badwords WHERE sovpadenie = 1'; $r = $db->query($q); while($s = $db->fetchrow($r)) $badwords_full[] = $s; //getting badwords array - with FULL compare $db->freeresult($r); $badwords_check->badwords_full = $badwords_full; // слова с полным совпадением $debug_words = $badwords_check->check(); //проверяем if(isset($debug_words) && !empty($debug_words)) //если массив с плохими словами не пуст, т.е. "плохие" слова были введены { foreach($debug_words as $badword) { $template->cycle_vars('badwords', array( 'WORD' => '- '.$badword )); } $template->vars(array('ERROR' => 'Вы ввели слова, использование которых, в целях противодействия спамерам, запрещено в разделе объявлений. Список введенных Вами запрещенных слов Вы можете увидеть ниже:')); $template->file='add_obyav.html'; $template->run(); exit(); } ?>
Два года назад делал матофильтр для сетевого сайта: PHP: <?php $mat = array('лох','дурак','идиот','сосунок','тупой','бот','ебана','хер','блин','блин','хрен','пидар','ебало','хуйня','ебануться','фиг','капец'); $text = explode(" ", strtolower($_POST['textik'])); $result = array_intersect($mat, $text); if (!$result){ echo "<script type='text/javascript'> alert('Похвально'); </script> <meta http-equiv='Refresh' content='0;URL=index.php'> <a href='index.php'>Назад</a>"; } else { echo "<script type='text/javascript'> alert('Иди-ка ты..'); </script> <meta http-equiv='Refresh' content='0;URL=http://lleo.aha.ru/na/'> <a href='http://lleo.aha.ru/na/'>Назад</a>"; } ?> P.S. Какой смысл делать класс с одним методом? UPD: Странно, куда-то делся скрипт с бОльшим "словарем".
у Котерова, если не ошибаюсь, встречал очень хороший (по описанию) матофильтр. Он пропустит слово рубля и корабля, но не пустит блин и №ля.
admyx сложновато довольно, да и пора уже пятерашным шрифтом писать, да и вообще причем тут класс - это делаестя функцией, для этого не надо делать класс.
А также баз данных... *представляет себе удобный интерфейс для управления списком и контент-менеджера, с любовью занимающегося им*