Столкнулся с такой вот проблемой. Необходима была функция антимата. Самому писать было некогда... Думал поброжу по просторам глобальной сети и найду готовую функцию. В итоге ничего я не нашел, кроме тех функций, которые дают мне по губам за слова "застрахуй", "команда", "корабля" и т.п. Решил все же сесть и написать свою функцию.
Кратко о функции: она делит строку на слова, убирает лишние символы и проверяет наличие каждого слова в "чёрном списке"(массиве запрещенных слов).
[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, но тогда будут проходить сообщения типа "лялялял я г(ус)ь, я люблю гу(сей".
Если писать грамотно(с пробелами после знаков препинания, с пробелами между слов), то функция вполне подходит.
Но увы... Сейчас люди готовы что только не сделать, что бы обойти антимат, матюкнуться... Хотя сами не знают зачем они это делают.
Вот временная ссылочка для тестирования функции: Вот...
Если у вас есть функция лучше этой, можете отписать её сюда.
return (preg_match('/[^а-яa-z]('.implode('|', $array).')[^а-яa-z]/siU', " $a ")) ? $repl : $text;
вместо цикла 
по моему уже давно все нормальные люди осознали обреченность создавать антимат
18 Ноя 2012, 23:45aBSuRD, отстаньте от менся со своими регулярными выражениями
DarveL, Ну если мне клиент заказал, что я могу поделать?
Виктор, попробовать переубедить для начала. Например дать ссылку на этот пост.
Если не поможет, то клиент пусть сам и мучается с потенциальными проблемами)
Во-первых: использовать регулярные выражения куда эффективнее.
Во-вторых: если клент хочет антимат - сделай ему функцию которая будет заменять матные слова по словарю. Словарь пускай он сам добавляет. Опять же используя регулярные выражения можно добиться куда большего эффекта.
Okula, Да так и есть. Есть словарь. Он сам добавляет туда слова. Замену не стал делать, ибо в ТЗ это не подразумевалось.
А на счёт регулярок, то да. Не спорю, что эффективней, но пока у меня нет времени на изучение этого
Спасибо за критику
добавлено спустя 8 минут:
Gemorroj, да мне самому интересно стала эта функция, после того, как не обнаружил нормальной функции в интернете:)
слово из трех букв, а между буквой точка, проходит
Хотя смысл темы так и не понял
XRAGE, точка - это разделитель между словами. Относительно грамматики.
Маты пройдут через все функции. Нет идеальной функции