Функцию я написал с нуля, и при тестировании убедился, что она работает практически
безотказно, а именно вырезает из текста все известные мне, да и наверно и всем вам матерные слова русского языка.
Основная работа функции (я её назвал antimat()) осуществляется за счет поиска и замены по регулярным выражениям, находящимся в массиве. Эти шаблоны регулярных выражений я очень кропотливо подобрал, мне пришлось для этого прочитать несколько статей о мате и нецензурных выражений, при этом узнал корни нецензурных слов и создал на полученных знаниях регулярные выражения для нахождения в тексте этих корней и ликвидации их вместе со словом в котором этот корень обнаружен.
Код программы:
Функция antimat()
function antimat($text) {
$s = '[^wа-я]*?'; // параметр для попуска между буквами для нахождения матерных слов типа "м а т" и тд
$cenzur = '[цензура]'; // на это значения переменной будут заменяться нецензурные слова
//массив содержащий шаблоны PCRE регулярных выражений, для поиска нецензурных корней
$ArrayPattern = array(
'[^вvw]'.$s.'[еeё]'. $s .'[бb]',
'[лl]'.$s.'[оo0]'.$s.'[хxh]',
'[еe]'.$s.'[лl]'.$s.'[дd]'.$s.'[аa@]',
'[мm]'.$s.'[uyу]'.$s.'[дd]'.$s.'[^рpr]',
'[пp]'.$s.'[иiеe]'.$s.'[зz3]'.$s.'[дd]',
'[^ю]'.$s.'[бb]'.$s.'[лl]'.$s.'(?:я|ja|j@)',
'[мm]'.$s.'[аa@оo0]'.$s.'[нn]'.$s.'[дd]',
'[дd]'.$s.'[rpр]'.$s.'[аa@оo0]'.$s.'(?:[ч4]|ch|сh)',
'[хxh]'.$s.'[уyuеe]'.$s.'(?:[ийijрprеёeяюлl]|ja|jа|ju|jи)',
'[зz3]'.$s.'[аa@]'.$s.'[лl]'.$s.'[уyu]'.$s.'[пp]',
'[гg]'.$s.'[аa@оo0]'.$s.'[нn]'.$s.'[дd]'.$s.'[оo0]',
'[пp]'.$s.'[иiеe]'.$s.'[дd]'.$s.'[аa@оo0иiрpr]'.$s.'[^гgфf]',
);
// перебираем каждый элемент массива ($ArrayPattern) и добавляем к нему еще нужные предикаты (они подходят для всех элементов массива)
foreach($ArrayPattern as $key = > $value)
{
$Pattern[] = '/(.*?)(?:[^s]*' . $value . '[^s]*)(.*?)/is';
}
// выполняем замену в тексте (пришедшем из аргумента функции $text) по шаблонам находящимся в массиве используя функцию preg_replace()
$no_mat = preg_replace($Pattern , "\1". $cenzur . "\2", $text);
// возвращаем текст после замены нецензурных слов
return $no_mat;
}
? >
Функция конечно не совершенная, есть над чем поработать, но попробовать её в действии следует, я не долго её тестировал, разве лишь на производительность, если вам не трудно сообщите в каких словах эта функция неправильно себя ведет, связавшись со мной по моим контактам, либо оставив комментарий здесь…