URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID10
Нить номер: 3634
[ Назад ]

Исходное сообщение
"Подлог имён в форуме"

Отправлено free_user , 27-Янв-08 16:18 
Люди выбирают ники из русских и латинских букв. Некоторые совпадают: О-O 3-З Ы-Ьl и т.д. Так можно ввести в заблуждение участников форума. Посоветуйте пожалуйста алгоритмы/таблицы замен совпадающих символов.
Думаю, при регистрации просто вырезать "плохие" символы и сравнивать всё что осталось с такими же обрезками существующих имён - плохая идея. Или хорошая?
Других идей пока нет.
P.S. Внешний вид форума - настраивается, шрифты могут быть разными.

Содержание

Сообщения в этом обсуждении
"Подлог имён в форуме"
Отправлено angra , 28-Янв-08 04:11 
Если разбираешься в перле, то могу скинуть на мыло код решающий подобную задачу


"Подлог имён в форуме"
Отправлено free_user , 28-Янв-08 10:07 
Жизнь заставит - буду и в перле разбираться =)
Собственно нужен только код для преобразования новых и старых имён в то, что потом можно просто сравнить (кодировка UTF-8 если важно). Почта у меня "free_user_" на сервере майлру, но если можно, лучше код или ссылку прямо тут выложить (вдруг кому надо).

"Подлог имён в форуме"
Отправлено angra , 29-Янв-08 01:53 
Кусок кода для проверки всей базы на наличие "дубликатов". В $sth запрос, возвращающий первым полем уникальный идентификатор записи(для простоты id), вторым собственно "имя". Используется utf8
  my %names;
  my @dupes;
  while (my @row=$sth->fetchrow_array) {
#собственно этот цикл совершает все трансформации и в хеш names попадают записи в которых ключ это "имя" после трансформаций, а значение это хешреф состоящий из пар id->"имя"(нетронутое трансформацией).
    use utf8;
    my $s=$row[1];
    use Encode;
    Encode::_utf8_on($s);
    $s=lc($s); #перевод в нижний регистр
    $s=~tr/etopahkxcbmЁё/еторанкхсвмее/; #преобразование английских в русские и ё в е
    $s=~tr/- \t_.,!?"'//d; #убирание пробелов и прочих знаков,возможно данная строка вам не нужна
    s/([йцукенгшщзхъфывапролджэячсмитьбюее])\1+/$1/g; #убирание подряд идущих русских символов, возможно стоит добавить a-z в класс
    Encode::_utf8_off($s);
    $names{$s}->{$row[0]}=$row[1];
  }
#теперь мы проходимся по names
  foreach my $k (keys %names) {
    my @t=keys %{$names{$k}};
    next if @t==1;
#а вот тут пора делать что-то с дубликатами. Напоминаю что в $names{$k} у нас хешреф в котором пары id->"имя" совпашие после преобразования имен. Например можно их вывести таким образом
   print "$_ ->  $names{$k}->{$_}\n" foreach @t
  }

"Подлог имён в форуме"
Отправлено free_user , 29-Янв-08 09:16 
Спасибо, только не совсем понятно:

>$s=lc($s); #перевод в нижний регистр
>$s=~tr/etopahkxcbmЁё/еторанкхсвмее/; #преобразование английских в русские и ё в е

Откуда Ё мы уже в нижнем регистре?

>3-З Ы-Ьl

А от такого поможет? Тут точно все возможные варианты?


"Подлог имён в форуме"
Отправлено angra , 29-Янв-08 10:11 
>Откуда Ё мы уже в нижнем регистре?

Согласен лишнее, осталось от варианта, когда не использовался юникод
>>3-З Ы-Ьl
>А от такого поможет? Тут точно все возможные варианты?

Я сказал подобную, а не такую же. В моем ТЗ это не требовалось. Поэтому и спрашивал про знание перла ибо нужна будет адаптация к вашему варианту. Кстати если строки будут получены не в utf8 или не из базы данных, то могут понадобится дополнительные изменения, работа с юникодом в перле таит в себе массу сюрпризов.



"Подлог имён в форуме"
Отправлено free_user , 29-Янв-08 17:20 
С кодировкой я справлюсь, алгоритм понятен. Спасибо angra!

Но нужна ещё полная таблица замен.
Ну или хоть каким словом это всё по научному называется (чтоб поиск попробовать)?