Люди выбирают ники из русских и латинских букв. Некоторые совпадают: О-O 3-З Ы-Ьl и т.д. Так можно ввести в заблуждение участников форума. Посоветуйте пожалуйста алгоритмы/таблицы замен совпадающих символов.
Думаю, при регистрации просто вырезать "плохие" символы и сравнивать всё что осталось с такими же обрезками существующих имён - плохая идея. Или хорошая?
Других идей пока нет.
P.S. Внешний вид форума - настраивается, шрифты могут быть разными.
Если разбираешься в перле, то могу скинуть на мыло код решающий подобную задачу
Жизнь заставит - буду и в перле разбираться =)
Собственно нужен только код для преобразования новых и старых имён в то, что потом можно просто сравнить (кодировка UTF-8 если важно). Почта у меня "free_user_" на сервере майлру, но если можно, лучше код или ссылку прямо тут выложить (вдруг кому надо).
Кусок кода для проверки всей базы на наличие "дубликатов". В $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
}
Спасибо, только не совсем понятно:>$s=lc($s); #перевод в нижний регистр
>$s=~tr/etopahkxcbmЁё/еторанкхсвмее/; #преобразование английских в русские и ё в еОткуда Ё мы уже в нижнем регистре?
>3-З Ы-Ьl
А от такого поможет? Тут точно все возможные варианты?
>Откуда Ё мы уже в нижнем регистре?Согласен лишнее, осталось от варианта, когда не использовался юникод
>>3-З Ы-Ьl
>А от такого поможет? Тут точно все возможные варианты?Я сказал подобную, а не такую же. В моем ТЗ это не требовалось. Поэтому и спрашивал про знание перла ибо нужна будет адаптация к вашему варианту. Кстати если строки будут получены не в utf8 или не из базы данных, то могут понадобится дополнительные изменения, работа с юникодом в перле таит в себе массу сюрпризов.
С кодировкой я справлюсь, алгоритм понятен. Спасибо angra!Но нужна ещё полная таблица замен.
Ну или хоть каким словом это всё по научному называется (чтоб поиск попробовать)?