Xwab
Форумыnavigate_nextПрограммирование на PHP

Функция антимата
Сообщения
Виктор

Столкнулся с такой вот проблемой. Необходима была функция антимата. Самому писать было некогда... Думал поброжу по просторам глобальной сети и найду готовую функцию. В итоге ничего я не нашел, кроме тех функций, которые дают мне по губам за слова "застрахуй", "команда", "корабля" и т.п. Решил все же сесть и написать свою функцию.
Кратко о функции: она делит строку на слова, убирает лишние символы и проверяет наличие каждого слова в "чёрном списке"(массиве запрещенных слов).
[php:1:8cf59bc173]<?php
header("Content-Type: text/html;charset=utf-8");
function antimat($text,$array=array("гусь","гусей","гуся"),$repl="[сообщение блокировано антиматом]")
{
$array_razdelitel=array(".",",","!","?",";",":","=","-","+","_"); // разделители
$array_simvol=array("&","@","\"","'","(",")","<",">","\\","/","`","~","\$","[","]","{","}","|","#","%","^","*","№"); // символы, которые будем убирать из строки
$a=mb_strtolower($text, 'utf-8'); // все символы в нижний регистр
$a=str_replace($array_razdelitel," ",$a); // заменяем все разделители на пробелы
$a=str_replace($array_simvol,"",$a); // чистим от лишних символов
$a=explode(" ",$a); // преобразовываем строку в массив из слов
foreach($a as $v)
if(in_array($v,$array)) // проверяем наличие слова в массиве запрещенных слов
{ // если есть
$text=$repl; // заменяем сообщение
break; // заканчиваем проверять, ибо далее проверять бессмысленно
}
return $text; // выводим текст
}
?>[/php:1:8cf59bc173]
Как вы видите функция не сложная.
Ее можно обойти сообщениями типа "ляляля я(гусь! ляляля", это можно было решить, добавив в массив $array_razdelitel элементы из массива $array_simvol, но тогда будут проходить сообщения типа "лялялял я г(ус)ь, я люблю гу(сей".
Если писать грамотно(с пробелами после знаков препинания, с пробелами между слов), то функция вполне подходит.
Но увы... Сейчас люди готовы что только не сделать, что бы обойти антимат, матюкнуться... Хотя сами не знают зачем они это делают.
Вот временная ссылочка для тестирования функции: Вот...
Если у вас есть функция лучше этой, можете отписать её сюда.


__________
посл.ред. 19 Ноя 2012, 8:44; всего 1 раз 18 Ноя 2012, 22:20
aBSuRD

return (preg_match('/[^а-яa-z]('.implode('|', $array).')[^а-яa-z]/siU', " $a ")) ? $repl : $text;
вместо цикла

18 Ноя 2012, 23:25
DarveL

по моему уже давно все нормальные люди осознали обреченность создавать антимат

18 Ноя 2012, 23:45
Виктор

aBSuRD, отстаньте от менся со своими регулярными выражениями
DarveL, Ну если мне клиент заказал, что я могу поделать?

19 Ноя 2012, 8:02
Gemorroj

Виктор, попробовать переубедить для начала. Например дать ссылку на этот пост.
Если не поможет, то клиент пусть сам и мучается с потенциальными проблемами)

19 Ноя 2012, 9:20
Okula

Во-первых: использовать регулярные выражения куда эффективнее.
Во-вторых: если клент хочет антимат - сделай ему функцию которая будет заменять матные слова по словарю. Словарь пускай он сам добавляет. Опять же используя регулярные выражения можно добиться куда большего эффекта.

19 Ноя 2012, 12:06
Виктор

Okula, Да так и есть. Есть словарь. Он сам добавляет туда слова. Замену не стал делать, ибо в ТЗ это не подразумевалось.
А на счёт регулярок, то да. Не спорю, что эффективней, но пока у меня нет времени на изучение этого
Спасибо за критику
добавлено спустя 8 минут:
Gemorroj, да мне самому интересно стала эта функция, после того, как не обнаружил нормальной функции в интернете:)

19 Ноя 2012, 13:46
XRAGE

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

19 Ноя 2012, 13:53
Виктор

XRAGE, точка - это разделитель между словами. Относительно грамматики.
Маты пройдут через все функции. Нет идеальной функции

19 Ноя 2012, 13:59
XRAGE

Виктор, согласен,гг

19 Ноя 2012, 14:04
Ответить на тему