Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
2 / 2 / 10
Регистрация: 17.09.2012
Сообщений: 860

фильтр мата

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

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

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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2013, 14:00
Ответы с готовыми решениями:

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

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

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

7
2 / 2 / 1
Регистрация: 28.10.2013
Сообщений: 13
05.11.2013, 14:26
У тебя ошибка в функции 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  [ТС]
Добавлено через 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
05.11.2013, 20:26

Не по теме:

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

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

Добавлено через 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
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
05.11.2013, 21:12
ну раз уж вы решили использовать регулярки, то, буквально, все это можно записать в пару строчек.. К чему тут целый класс не пойми чего - я не знаю..
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  [ТС]
это вместо чего вставлять?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
05.11.2013, 22:39
вместо всего

Добавлено через 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2013, 22:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru