После ответа в теме «
запрет на похожие ники» озадачился мыслью: надо бы таки сделать проверку «похожих» имен при регистрации, в том числе, и содержащих кириллицу (в вышеуказанной теме привел решение только для случая, когда имя содержит только латиницу).
Идея была такая: продукт, позволяющий в настройках выбирать метод проверки имен и использующий выбранный метод при регистрации для нахождения пользователей с похожими именами. Метода подразумевалось два: первый – уже описанный с использованием функции
SOUNDEX для имен без кириллицы, второй – для проверки кириллических имен. Почему два? Хотелось, с одной стороны, сделать универсальный продукт, а сдругой – оставить возможность «простой» проверки, если на форуме в принципе запрещены нелатинские символы в именах и для проверки достаточно первого метода.
Что использовать для реализации второго метода? Элементарно – регулярные выражения, а конкретнее – функцию
REGEXP, позволяющую в SQL-запросе сравнивать строки с шаблоном
PCRE. С этим все ясно. Остается только написать скрипт для составления подходящего для введенного имени шаблона.
Но сперва нужно решить – а какие собственно имена считать похожими? Я для себя решил так: имена похожи, если после вырезки из них всех незначащих символов оба ника одинаковы визуально или фонетически. Что за незначащие символы? Это, вобщем говоря, все символы, кроме букв и цифр. А для значащих символов (букв и цифр) нужно составить список замен (на какие похожие символы можно заменить данный). Но при этом не нужно забывать т.н. «незначащие» символы, которыми может быть щедро приправлено имя: например, имена «БАРАБАН» и «БАР-А-БАН» должны быть посчитаны похожими. Также нужно учесть повторение символов: «БАРАБАН» и «БАР-РАБАН» опять-таки похожи. Т.о. правило для формирования шаблона таково:
- в начале и конце – возможно 1 незначащий символ;
- значащие символы заменены на список возможных замен, повторяющийся пару раз;
- между значащими символами – до 2-х незначащих символов.
Продукт написан и протестирован на форуме 3.8.1 с 20 тысячами пользователями, в именах которых разрешено использование кириллицы – полет нормальный.
Нерешенные проблемы: многосимольная замена. В данный момент при составлении шаблона заменяться
один каждый символ начальной строки на шаблон со списком возможных
односимвольных замен, т.е., например, «Ш» заменятся на «W», но некоторые извращенцы могут ведь заменить букву «Ш» на
последовательность символов – «LLl», и наоборот: «ch» => «ч», «я» => «ja» и т.п. Этот вариант, к сожалению, в скрипте не учтен – будет время, займусь этим, а пока придется довольствоваться тем, что есть.
Продукт содержит один модуль (на хуке «register_addmember_process» с весьма подробными коментариями), одну настройку и одну фразу («gcsu_error») в группе «Сообщения об ошибках». Во фразе возможны три подстановки: {1} – ID найденного пользователя с «похожим» именем, {2} – собственно его имя и {3} – имя с учетом разметки группы.
Просто импортируем и в настройках указываем предпочтительный метод проверки (по умолчанию проверка отключена).
З.Ы. Если забыл про какие-то замены (или сделал лишние по вашему мнению) – просто подправьте ассоциативный массив «$replace» в модуле: ключ – заменяемый символ, значение – список возможных замен.