2 / 2 / 10
Регистрация: 17.09.2012
Сообщений: 860
1

фильтр мата

05.11.2013, 14:00. Показов 8151. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите почему фильтр мата не фильтрирует маты?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?
 
setlocale (LC_ALL, "ru_RU.CP1251"); 
 
 class anti_mate { //latin equivalents for russian letters 
 var $let_matches = array ( 
 "a" => "а", 
 "c" => "с", 
 "e" => "е", 
 "k" => "к", 
 "m" => "м", 
 "o" => "о", 
 "x" => "х", 
 "y" => "у", 
 "ё" => "е" ); 
 //bad words array. Regexp's symbols are readable ! 
 var $bad_words = array (".много мата");
 
 
 function rand_replace (){ 
 $output = " [censored] "; 
 return $output; 
 } 
 
 function filter ($string){ 
 $counter = 0; 
 $elems = explode (" ", $string); 
 //here we explode string to words 
 $count_elems = count($elems); 
 for ($i=0; $i<$count_elems; $i++) { 
 $blocked = 0; 
 /*formating word...*/ 
 $str_rep = preg_match ("[^a-zA-Zа-яА-Яё^]", "", strtolower($elems[$i]));
 for ($j=0; $j<strlen($str_rep); $j++) { 
 foreach ($this->let_matches as $key => $value) { 
 if ($str_rep[$j] == $key) 
 $str_rep[$j] = $value; 
 } 
 } 
 /*done*/ 
 /*here we are trying to find bad word*/ 
 /*match in the special array*/ 
 for ($k=0; $kbad_words; $k++) { 
 if (ereg("\*$", $this->bad_words[$k])) { 
 if (ereg("^".$this->bad_words[$k], $str_rep)) { 
 $elems[$i] = $this->rand_replace(); 
 $blocked = 1; 
 $counter++; 
 break; 
 } 
 } 
 if ($str_rep == $this->bad_words[$k]){ 
 $elems[$i] = $this->rand_replace(); 
 $blocked = 1; 
 $counter++; 
 break; 
 } 
 } 
 } 
 if ($counter != 0) 
 $string = implode (" ", $elems); //here we implode words in the whole string 
 return $string; 
 } 
 }
 ?>
в код обработчика вписываю

PHP
1
2
 $anti_mate = new anti_mate();
  echo $anti_mate->filter("мат ");
а он выводит маты вместо слова [censored]

Добавлено через 8 часов 5 минут
никто не знает что ль?

Добавлено через 2 часа 18 минут
поможет кто нибудь?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2013, 14:00
Ответы с готовыми решениями:

Фильтрация слов (фильтр мата) в гостевой книге
Всем привет!:) имеется textarea для гостевой книги, мне надо чтобы отфильтровать оставленные...

Фильтр мата
Здравствуйте. Задача такова - Реализовать мат-фильтр для чата. Есть несколько вопросов по...

Фильтр текста на наличие русского мата
Ребят помогите как отфильтровать русский мат ...хотЯ бы часть регуляркой или справочником...

Определение мата в шахматах?
Подскажите пож как можно определить мат в шахматах? А то не могу придумать как это...

7
2 / 2 / 1
Регистрация: 28.10.2013
Сообщений: 13
05.11.2013, 14:26 2
У тебя ошибка в функции filter 43 строка в твоем коде, нету до кокого условия перебирать $k вот рабочий пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function filter ($string){
            $counter = 0;
            $elems = explode (" ", $string);
            $count_elems = count($elems);
            for ($i=0; $i<$count_elems; $i++)
            {
            $blocked = 0;           
            $str_rep = eregi_replace ("[^a-zA-Zа-яА-Яё]", "", strtolower($elems[$i]));
                for ($j=0; $j<strlen($str_rep); $j++)
                {
                    foreach ($this->let_matches as $key => $value)
                    {
                        if ($str_rep[$j] == $key)
                        $str_rep[$j] = $value;
 
                    }
                }
                    
                for ($k=0; $k<count($this->bad_words); $k++)
                {
                    if (ereg("\*$", $this->bad_words[$k]))
                    {
                        if (ereg("^".$this->bad_words[$k], $str_rep))
                        {
                        $elems[$i] = $this->rand_replace();
                        $blocked = 1;
                        $counter++;
                        break;
                        }
                    
                    }
                    if ($str_rep == $this->bad_words[$k]){
                    $elems[$i] = $this->rand_replace();
                    $blocked = 1;
                    $counter++;
                    break;
                    }
 
                }
            }
            if ($counter != 0)
            $string = implode (" ", $elems);
return $string;
}
0
2 / 2 / 10
Регистрация: 17.09.2012
Сообщений: 860
05.11.2013, 20:12  [ТС] 3
Добавлено через 11 минут
ХМ НЕ ДО КОНЦА РАБОТАЕТ, ОН НА КАЖДОЕ СЛОВО ПИШЕТ [censored]

Добавлено через 4 минуты
Цитата Сообщение от DpoH Посмотреть сообщение
У тебя ошибка в функции filter 43 строка в твоем коде, нету до кокого условия перебирать $k вот рабочий пример:
может в фильтре что нибудь ещё надо допилить?

Добавлено через 21 минуту
помоему тут где то ошибка

PHP
1
 for ($k=0; $k<count($this->bad_words); $k++){
Добавлено через 12 минут
не могу понять в чем ошибка(

Добавлено через 3 минуты
в чем тут может быть ошибка???

PHP
1
2
3
4
5
6
7
  for ($k=0; $k<count($this->bad_words); $k++){
          if (preg_match("/\*$/", $this->bad_words[$k])){
          if (preg_match("/^/".$this->bad_words[$k], $str_rep)){
          $elems[$i] = $this->rand_replace();
          $blocked = 1;
          $counter++;
          break;
Добавлено через 9 минут
ВОТ ДОПОЛНЕННЫЙ ВСТАВЛЯЮ ВСЕ РАВНО НЕ ФИЛЬТРУЕТ

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
 
/**
 * Реализация hook_filter_info().
 */
function filter_antimat_filter_info() {
  $filters['filter_time'] = array(
    'title' => 'Антимат',
    'description' => 'Заменяет мат в тексте высказываний на <font color=red>[цензура]</font>.',
    'process callback' => '_filter_antimat_filter_antimat_process',
  );
  return $filters;
}
 
/**
 * Чего будем делать с неприятным содержимым
 */
function _filter_antimat_filter_antimat_process($msg, $filter) {
  //error_reporting(E_ALL ^ E_DEPRECATED);
  $anti_mate = new anti_mate();
  $msg=trim(page_bb($_POST['msg']));
  return $msg=$antimate->filter( $msg );
}
 
 
/********************************************/
/*Welcome to Anti Mate PHP Class source-code!*/
/*The Anti Mate PHP Class and its functions, contexture are copyrighted by s1ayer [www.spg.arbse.net]*/
/*Current file: anti_mate.php*/
/*Optimized for PHP 4.3.6, Apache 1.3.27*/
/********************************************/
 
/*<=====================Describing anti_mate class==============================>*/
class anti_mate {
    //latin equivalents for russian letters
    var $let_matches = array (
    "a" => "а",
    "c" => "с",
    "e" => "е",
    "k" => "к",
    "m" => "м",
    "o" => "о",
    "x" => "х",
    "y" => "у",
    "ё" => "е"
);
    //bad words array. Regexp's symbols are readable !
    var $bad_words = array (".*[цензура](й|и|я|е|ли|ле).*", ".*[цензура](з|с)д.*", "[цензура].*", ".*[цензура](д|т|ц).*", "(с|сц)ук(а|о|и).*", "[цензура].*", ".*[цензура].*", "[цензура].*", ".*[цензура](а|и)(н|с|щ|ц).*", ".*[цензура](ч|щ).*", ".*[цензура](о|е|а)р.*", ".*[цензура].*", "г(а|о)ндон.*", ".*залуп.*", "г(а|о)вн.*");
 
function rand_replace (){
        $output = " <font color=red>[цензура]</font> ";
        return $output;
}
function filter ($string){
            $counter = 0;
        $string = str_replace("\n", " {nl} ", $string); // Заменяем символя переноса строки на коды
            $elems = explode (" ", $string); //here we explode string to words
            $count_elems = count($elems);
            for ($i=0; $i<$count_elems; $i++)
            {
            $blocked = 0;
                for ($j=0; $j<strlen($str_rep); $j++)
                {
                    foreach ($this->let_matches as $key => $value)
                    {
                        if ($str_rep[$j] == $key)
                        $str_rep[$j] = $value;
 
                    }
                }
            /*done*/
 
            /*here we are trying to find bad word*/
            /*match in the special array*/
                for ($k=0; $k<count($this->bad_words); $k++)
                {
                    if (preg_match('/\\*$/', $this->bad_words[$k]))
                    {
                        if (preg_match('/^'.$this->bad_words[$k].'/', $str_rep))
                        {
                        $elems[$i] = $this->rand_replace();
                        $blocked = 1;
                        $counter++;
                        break;
                        }
                    
                    }
                    if ($str_rep == $this->bad_words[$k]){
                    $elems[$i] = $this->rand_replace();
                    $blocked = 1;
                    $counter++;
                    break;
                    }
 
                }
            }
            if ($counter != 0)
            $string = implode (" ", $elems); //here we implode words in the whole string
        $string = str_replace(" {nl} ", "\n", $string);
return $string;
}
}
/*<===================================END=======================================>*/
 Комментарий модератора 
Использование нецензурных выражений запрещено в любом виде.


Добавлено через 37 минут
кто поможет со скриптом?

Добавлено через 11 минут
наверное никто не поможет?
0
KOPOJI
05.11.2013, 20:26
  #4

Не по теме:

я вообще не понимаю суть проблемы :pardon:

0
2 / 2 / 10
Регистрация: 17.09.2012
Сообщений: 860
05.11.2013, 21:05  [ТС] 5
плохие слова скрипт не фильтрирует

Добавлено через 51 секунду
например плохое слово ругань должен заменить на [ЦЕНЗУРА]

я пишу ругань и он не заменяет его (оставляет как есть)

Добавлено через 6 минут
вот так у меня выведенно в саму тех поддержку

PHP
1
2
3
4
5
6
7
###############################
    $antimate = new anti_mate;
 
    $msg=trim(page_bb($_POST['msg']));
  
    # Вызываем проверку на мат
    $msg = $antimate->filter($msg);

Добавлено через 7 минут
ну так что кто поможет?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
05.11.2013, 21:12 6
ну раз уж вы решили использовать регулярки, то, буквально, все это можно записать в пару строчек.. К чему тут целый класс не пойми чего - я не знаю..
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$regexp = '~
(?:
  [яеё]?бл(?:ин|я(?:ть)?)|
  мат|
  другой_мат|
  .....
)
.*?
(?=[\\s,.!?-]|\\Z)
~ixu';
if(!preg_match_all($regexp, $text, $matches))
    return true; //все ок
else
{
    //какая-то обработка, все матные слова хранятся в $matches
}
Либо, если просто заменять - то еще проще.
PHP
1
2
3
4
5
6
7
8
9
10
11
$regexp = '~
(?:
  [яеё]?бл(?:ин|я(?:ть)?)|
  мат|
  другой_мат
)
.*?
(?=[\\s,.!?-]|\\Z)
~ixu';
    
$text = preg_replace($regexp, '[CENSORED]', $text);
0
2 / 2 / 10
Регистрация: 17.09.2012
Сообщений: 860
05.11.2013, 21:23  [ТС] 7
это вместо чего вставлять?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
05.11.2013, 22:39 8
вместо всего

Добавлено через 3 минуты
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function filter_filth($text) 
{
    $regexp = '~
    (?:
      [яеё]?бл(?:ин|я(?:ть)?)|
      мат|
      другой_мат
    )
    .*?
    (?=[\\s,.!?-]|\\Z)
    ~ixu';
 
    return preg_replace($regexp, '[CENSORED]', $text);
}
 
echo filter_filth('Матттт а тут еще какой-то текст а затем ДРУГОЙ_МАТТ!!!'); //[CENSORED] а тут еще какой-то текст а затем [CENSORED]!!!
Добавлено через 58 секунд
слова только свои вставьте туда вместо "мат" и "другой_мат"..
0
05.11.2013, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2013, 22:39
Помогаю со студенческими работами здесь

Сеть университета физ мата
Задача:Пусть физико-математический факультет некоторого университета имеет следующую структуру и...

Регулярное выражение шаблона-мата скрипта автоцензора
К примеру для слова &quot;падонаг&quot;, шаблон: /+++++++/i но шаблон не сработает на слова &quot;п а д о н а...

Фильтр по форме по нескольким логическим полям с использованием кнопки Общий фильтр
Здравствуйте! Есть простая таблица и созданная форма. Идея в том, чтобы ставя галки осуществлять...

Фильтр
Доброго времени суток! Подскажите, как сделать так, чтобы при фильтрации можно было не писать весь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru