Фильтруй базар?
Автор: Дмитрий Лебедев
Источник: phpclub.ru
Часто можно встретить обсуждения в форумах — "как отслеживать маты". Вопрос
этот обсуждался уже не раз, и сейчас снова пошёл по
классическому сценарию:
— Как отслеживать маты?
— Регулярным выражением можно. А лучше брось эту затею.
— Дайте регулярное выражение.
— А если он введёт "с.л.о.в.о", что тогда делать будешь? Ещё сложнее. Плюнь на это дело.
— Дайте регулярное выражение.
— А если латиницей? Брось.
— Дайте регулярное выражение.
— Брось эту затею.
— Дайте регулярное выражение.
— Брось эту затею.
(и так далее)
Вопрос, конечно же, не праздный, и многие умы человечества
над ним бьются, но какого-нибудь удачного решения я не видел.
Грустно читать форум по Формуле-1 с именами "Михаэль Шума***" или "Джонни ***берт". Интересно, а как этот форум
будет реагировать на слово "застрахуйте"?
Появилась как-то в ураинском интернете страница "проверка
слова на маты". Предлагалось ввести слово или фразу и
посмотреть, что скажет программа, а если программа неправильно
определяла результат, написать авторам. И таким образом авторы
хотели силами веба протестировать программу, найти-таки
универсальный алгоритм распознавания русских матов. Больше об
этом тестере никто ничего не слышал... Сам проверял —
Шумахера и Херберта считает матерками, почта к авторам не
идёт — не может соединиться с их сервером.
Читал документацию по White Tiger WWW Board — там
предусматривалась защита от матов включая ввод латинскими
буквами и, например, двух слэшей вместо буквы "л": "/\". Не
думаю, что это сильно поможет. Через такой фильтр спокойно
пройдёт слово через точки.
Стоит ли говорить про то, что замена слов на звёздочки
подтолкнёт посетителей на разные изыскания с целью обойти
защиту. Поведение целиком зависит от манер участников и
атмосферы форума. Стоит сравнить хотя бы форум о Формуле-1
сайта телекомпании ПТП и сайта f1news.ru — форум f1news.ru, по-моему,
самый уютный форум данной тематики, а в ПТП — проходной
двор и грызня по мелочам. Так что программы-резалки облико
морале не поднимут это точно.
И, всё-таки, попробуем написать регулярное выражение и
поймать им хоть что-то. Первое, что приходит в голову: "сука|блядь|мудак"
Вспоминаем про латиницу. Та-ак, лучше сразу применить
другой подход: писать слова в массив, а из него формировать
строку регулярного выражения. Делаем так же массив одинаковых
символов кириллицы и латиницы и заменяем через preg_replace:
$letter_cyr[] = "/а/"; $letter_lat[] = "[аa]";
$letter_cyr[] = "/л/"; $letter_lat[] = "[". preg_quote("л/\"). "]";
$letter_cyr[] = "/к/"; $letter_lat[] = "([kк]|\|<)";
Последний вариант — буква к в виде "|<". Кстати,
можно вместо такого массива кода держать файл со строками,
разделёнными табуляторами. Но вернёмся к выражению:
"[cс][yу]([kк]|\|<)[aа]|[bб][л\/\\][Rя][Dд][ьb]|[mм][yу][Dд][aа]([kк]|\|<)"
Почти все символы имеют латинский аналог. По-моему, этого
достаточно, чтобы отказаться от такой затеи. Нет? Пойдём
дальше. Перед тем, как заменять русские символы на комбинации,
предусмотим возможность ввода слова через точки, тире,
подчёркивания или пробелы:
$word = preg_replace("/./",
"\\0[^\w]*", $word);
Слова, написанные с ошибками — "блять" — просто
внесём в словарь вместе с правильными (кстати, у немецких
шифровальщиков во Вторую Мировую Войну проблема была —
русские шифровки раскодировались в несколько раз дольше, чем
шифровки англичан и французов, потому что наши шифровальщики
часто совершали ошибки). Правда, есть ещё возможность написать
мат заглавными буквами и разделить его строчными: "БаЛЯТЬ",
"МАаНДаАВОШКА" — простор для фантазии богатый, правда?
Прикрыть такое уже невозможно — если сделать, скажем
$word = preg_replace("/./", "\\0[^
]*", $word);
То будет коцать уже приличные слова — как в анекдоте
про Вовочку "вообще-то я имел в виду фамилию Хэммингуэй, но
ход ваших мыслей мне нравится". Дальше фантазировать можно, но
это уже граничит с маразмом. Если дискуссии в вашем форуме
говнистые, резалка не поможет. Разве что можно попробовать
сделать некоторую разумную проверку сообщения на входе и
посылать сообщения модератору с подсветкой подозрительных
слов. Однако фильтр может пропустить какое-то слово, а говнюки
из форума будут специально маскировать маты в сообщениях,
чтобы модератор их не увидел.
Итак, резюмируя всё это и выводя мораль, скажу, что не вижу
смысла в такой проверялке матов. Она будет работать ненадёжно.
А если матёрые матершинники узнают, что таковая работает, то
держитесь крепче — будут маскироваться, искать пробелы в
вашем фильтре. Пока никакой алгоритм не может определять лучше
человека такие вещи как употребление табуированной лексики или
ругань, а в правилах большинства конференций есть так же
запрет на личные оскорбления, вызывающее поведение,
спам — без модератора всё равно не обойтись