Home   Antimat.pm


Antimat.pm

Автор Илья Солдаткин, arc@tcen.ru Copyright 2001 Ilya Soldatkin. All rights reserved.
http://www.tcen.ru/antimat

Этот модуль предназначен для замены, обнаружения или удаления мата из строки. Этой строкой могут быть сообщения в гостевой книге, чате или форуме. Модуль позволяет заменять мат и в тех случаях, когда русский мат написан английскими буквами или между буквами матерного выражения поставлены символы-разделители (любые символы за исключением букв или цифр. Например, пробелы, символы подчеркивания).

Методы модуля:

$mat=Lingua::RU::Antimat->new($codepage);

Этот метод создает новый объект. В этом методе можно также задать кодировку, в которой будет находиться строка содержащая мат. Если метод new() вызван без аргументов, то будет использована кодировка win-1251. Если Ваш текст в кодировке KOI8-R, вызовите этот метод с параметром $codepage равным 'koi8'. Если Вы используете другую кодировку(отличную от KOI8-R и win-1251), напишите мне, я сделаю поддержку и для нее.

Примеры:

$mat=Lingua::RU::Antimat->new; #для текста в win-1251

$mat=Lingua::RU::Antimat->new('koi8'); #для текста в KOI8-R

$clean_text=$mat->remove_slang($dirty_text);
Этот метод заменяет мат в строке. Метод в качестве своего аргумента берет строку содержащую мат и возвращает строку, где этот мат заменен на слово 'бип', или на строку которую вы указали в методе set_bip(). Метод set_bip() описан ниже.

$bool=$mat->detect_slang($dirty_text);
Этот метод определяет есть ли мат в строке и возвращает 1, если мат найден и 0 в противном случае.

$mat->set_bip($bip);
Этот метод устанавливает строку, на которую будут заменены матерные слова методом remove_slang()

Примеры:

$mat->set_bip(''); # просто удалим мат

$mat->set_bip('Прошу прощения!'); #длинно, но тоже правильно

$mat->load_dict($file);
Этот метод загружает словарь с дополнительными матерными словами.

Переменная $file - абсолютный или относительный путь до словаря.

Пример:

$mat->load_dict('/home/www/badwords');

Требования к словарю:

- каждая строчка в словаре должна быть словом или регулярным выражением

- каждое cлово или регулярное выражение должно начинаться и оканчиваться на букву или цифру. Что, в общем-то, логично. Все, что отличается от букв и цифр, считается признаком начала слова и уже учтено при поиске или замене.

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

Пример словаря:

мама
дедушк(?:[аеуи]|ой)
п[\W_]*а[\W_]*п[\W_]*(?:[еуыа]|о[\W_]*й)


Установка модуля

Стандартная, UNIX

После скачивания и разархивации введите команды

perl Makefile.PL

make

make test

make install

В том случае, если Вы хотите поставить модуль в свою директорию, например в /home/my/perl/directory, то тогда строчку perl Makefile.PL измените на

perl Makefile.PL LIB=/home/my/perl/directory

А затем, в своей программе, перед

use Lingua::RU::Antimat;

вставьте

use lib '/home/my/perl/directory';

WINDOWS, ActiveStatePerl

Скачайте ppm архив, разархивируйте его, введите команду

ppm install Lingua-RU-Antimat.ppd

Ручная, для Windows и UNIX

Скачайте архив. Разархивируйте его в какую-нибудь директорию. Для UNIX это команды

gunzip archive.tar.gz

tar xvf archive.tar

Затем, в каталоге, в который Вы хотите поставить модуль (например, D:\Perl\MY\Modules), создайте каталог Lingua. В этом каталоге создайте каталог RU. Скопируйте из директории, в которой находится разархивированный архив, в каталог D:\Perl\MY\Modules\Lingua\RU файл Antimat.pm .

Затем в программе перед

use Lingua::RU::Antimat;

вставьте

use lib 'D:\Perl\MY\Modules';

Данный модуль требует наличия модуля FileHandle. Модуль FileHandle довольно распространенный и редко когда отсутствует на сервере. Но если его нет, необходимо будет его поставить. Если с этим с этим возникнут проблемы, дайте мне знать. Я поставлю ссылку на этот модуль.


Использование в программе

a) Сервер работает под UNIX'ом

Настройка русского языка в программе

Прежде всего, нужно установить поддержку русского языка в программе.

1. Определите, в какой кодировке вы будете передавать текст c матом методам модуля. Обычно это кодировка совпадает с той кодировкой, в которой у Вас хранится документы на сервере.

2. Спросите у администратора сервера, как называется локаль для этой кодировки. Если ее нет, попросите ее поставить, это у него займет 2-3 минуты. В результате Вы получите название локали в виде ru_RU.CP1251 или ru_RU.KOI8-R (также возможны другие варианты названий, например ru_RU).

Также может помочь чтение документации о локале perldoc perllocale и man locale.

3. Итак, название локали известно, теперь нужно подключить эту локаль в программе.

Вставляем перед

use Lingua::RU::Antimat;

строчку

use POSIX qw(locale_h);

а перед тем, как начнете использовать методы модуля, вставьте

use locale;

setlocale(LC_CTYPE,'ru_RU.CP1251');

,где вместо ru_RU.CP1251 должно быть название локали, которую Вы получили от Администратора.

Каким образом можно узнать, что локаль настроена неправильно? Матерные слова написанные маленькими буквами, будут вырезаться, а написанные заглавными буквами - нет. В общем-то, настройка локали нужна именно для того, чтобы выполнить поиск и замену слов независимо от того, в каком регистре они написаны. Если же и матерные слова написанные маленькими буквами не заменяются, то это означает, что:

a) неправильно определена кодировка для текста с матом;

б) кодировка неправильно указана в методе new() (см. ниже).

Мне нужно удалить мат, а затем проверить правильность e-mail'a. До того, как поставил локаль, все отлично работало. Теперь мат удаляется, но при проверке e-mail'а разрешены русские буквы.

Если дальше в скрипте русская локаль не нужна, вставте после того, как выполните последний метод модуля, строку

no locale;

После этого поддержка русского языка будет отключена.


Использование методов модуля

После того, как будет настроена локаль, можно переходить к использованию методов модуля.

Пусть в переменной $dirty_text хранится текст, в котором нужно заменить все матерные слова на слово 'бип'.

Если у Вас этот текст находится в кодировке win-1251, то тогда все, что Вам надо написать это:

my $mat= Lingua::RU::Antimat->new;

$clean_text=$mat->remove_slang($dirty_text);

В переменной $clean_text находится результат. Аналогичным образом Вы будете вызывать и другие методы для работы с матом. Например, для того, чтобы сделать замену не на слово 'бип', а на слово 'Ой!' следует вызвать метод set_bip

$mat->set_bip('Ой!');

Все вместе:

my $mat= Lingua::RU::Antimat->new;

$mat->set_bip('Ой!');

$clean_text=$mat->remove_slang($dirty_text);

Теперь, если у Вас текст с матом находится в кодировке KOI8-R. В этом случае вместо строчки

my $mat= Lingua::RU::Antimat->new;

надо написать

my $mat= Lingua::RU::Antimat->new('koi8');

Все остальное останется без изменений.


Собираем все это вместе

Так это все выглядит вместе для текста в кодировке win-1251:

use POSIX qw(locale_h);

use Lingua::RU::Antimat;

...

...

use locale;

setlocale(LC_CTYPE,'ru_RU.CP1251');

my $dirty_text='Здесь много матерных выражений';

my $mat= Lingua::RU::Antimat->new;

$mat->set_bip('Ой!');

my $clean_text=$mat->remove_slang($dirty_text);

no locale;

На этом цели обучалки достигнуты. Вы должны теперь суметь поставить этот модуль, настроить поддержку русского языка в Вашей программе и не смущаться при виде объектов. Остальные методы модуля описаны в документации.


б) Сервер работает под WINDOWS

Такого понятия как локаль под Windows нет, так что и проблем с наcтройкой локали у Вас тоже не будет.

Использование методов модуля

Здесь можно сразу переходить к использованию модуля.

Пусть в переменной $dirty_text хранится текст, в котором нужно заменить все матерные слова на слово 'бип'.

Все, что Вам надо написать, это

my $mat= Lingua::RU::Antimat->new;

$clean_text=$mat->remove_slang($dirty_text);

В переменной $clean_text находится результат. Аналогичным образом вы будете вызывать и другие методы для работы с матом. Например, для того, чтобы сделать замену не на слово 'бип', а на слово 'Ой!' следует вызвать метод set_bip

$mat->set_bip('Ой!');

Все вместе:

my $mat= Lingua::RU::Antimat->new;

$mat->set_bip('Ой!');

$clean_text=$mat->remove_slang($dirty_text);


Собираем все это вместе

Для Windows скрипт будет выглядеть следующим образом:

use Lingua::RU::Antimat;

...

...

my $dirty_text='Здесь много матерных выражений';

my $mat= Lingua::RU::Antimat->new;

$mat->set_bip('Ой!');

my $clean_text=$mat->remove_slang($dirty_text);

На этом цели обучалки достигнуты. Вы должны теперь суметь поставить этот модуль и не смущаться при виде объектов. Остальные методы модуля описаны в документации.




   stolet.com