Версия для печати темы
MyDC.ru _ Запросы скриптов для PtokaX _ Запрет символов в никах и цифровых ников
Автор: DrakonSP 14.2.2010, 6:51
Здравствуйте! Как Вы уже поняли нужен скрипт запрещающий использовать цифровые (состоящие только из цифр) ники.
http://mydc.ru/ipb.html?act=findpost&pid=11000 не то! Т.к. тут идёт запрет определёных символов в конце и начале ника,
А нужно запрещать вход на хаб никам, состоящими только из цифр.
Тобишь, я не хочу запрещать цифры в никах, но хочу запретить вход пользователям, чьи ники состоят только из цифр.
Например:
12345
13579
123654
384257 - Запретить использование таких ников!
DrakonSP123
Вася15
536Сергей - Ники такого рода запрещать не надо!
Скрипт не бред, потому что проблема очевидна...
На хаб за день могут зайти десятки уникальных пользователей с ником 12345.
Но самая жара начинаеться, когда какой-нибудь умник с ником 12345 регистрируеться,
И догадайтесь с каким паролем?
Автор: Serx 14.2.2010, 10:57
Что-то вроде такого:
Код
function ValidateNickArrival(tUser)
if not string.find(tUser.sNick,"%D") then
Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
Core.Disconnect(tUser)
end
end
Автор: Nickolya 14.2.2010, 17:14
Смущает меня такая регулярка, я бы сделал вот так:
Код
function ValidateNickArrival(tUser)
if tUser.sNick:match("^(%d+)$") then
Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
Core.Disconnect(tUser)
end
end
Автор: Setuper 14.2.2010, 17:33
Лучше вот так:
Код
function ValidateNickArrival(tUser)
if tUser.sNick:find"^%d+$" then
Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
Core.Disconnect(tUser)
end
end
Захват (%d+) лучше не делать, так как это лишние действия, и вместо match в условии использовать find. Так как интерпретатору проще сравнить число, которое возвращает find, со значением boolean, чем сравнивать строку, которую возвращает match. Ведь строка - это массив символов. Намного проще работать с числами, чем с массивами. Не делая захваты, строк вообще не будет, а метод find вернёт только 2 числа (начало и конец регулярного выражения, если таковое было обнаружено).
Автор: trojan 14.2.2010, 22:32
1
Автор: Nickolya 14.2.2010, 22:36
Так сделай маленькую модификацию скрипта выше:
Код
tExept = {
["911"] = true,
}
function ValidateNickArrival(tUser)
if not tExept[tUser.sNick] and tUser.sNick:find"^%d+$" then
Core.SendToUser(tUser, "Ники состоящие только из цифр запрещены")
Core.Disconnect(tUser)
end
end
Автор: DrakonSP 16.2.2010, 1:46
Хочу сделать скрипт по своим фунциям схожим вот с http://mydc.ru/ipb.html?act=findpost&pid=11000
Но по системе ValidateNickArrival и find
Мне всего лишь надо что бы мне подсказали с захватом
А то ещё недостаток вышеуказанного скрипта, то что там идёт разделение запрещ. символ в начале и в конце ника.
Напишите пожалуйста пример захвата который искал бы к примеру запрещёный символ @ во всем нике (в какой бы части он не находился)
Дальше я сам разберусь... Надеюсь
Или это возможно только по такой системе?
Код
"^(%@)" - В начале ника
"(%@)" - В конце ника
Спасибо!
Автор: Serx 16.2.2010, 10:47
Код
tUser.sNick:find"^(@)" -- в начале ника (1й символ)
tUser.sNick:find"(@)" -- на любом месте в нике
tUser.sNick:find"(@)$" -- не уверен, но думаю это будет отлавливать в конце ника (последний символ)
Если нужен именно сам факт нахождения символа в нике, то скобки можно убрать (они нужны именно для захвата символа).
а вообще вот тут очень полезная информация по таким вопросам: http://mydc.ru/topic266.html
Автор: DrakonSP 16.2.2010, 19:31
Пишу вот так:
Код
tUser.sNick:find"(@)" -- на любом месте в нике
Он действительно отлавливает символ @ в любом месте ника.
так же я хочу запрещать символ ! например. Пишу:
Код
tUser.sNick:find"(@!)"
И скрипт не отлавливает ничего ни @ ни !
Как быть? может я чего не так делаю?
Автор: Wariner 16.2.2010, 19:48
конечно! ты сейчас пытаешься найти в нике не каждый символ по отдельности а их комбинацию в определённом порядке.
Автор: DrakonSP 16.2.2010, 20:14
Цитата(Wariner @ 16.2.2010, 19:48)
конечно! ты сейчас пытаешься найти в нике не каждый символ по отдельности а их комбинацию в определённом порядке.
А вот так правильней будет?
Код
tUser.sNick:find"([%!@])"
Автор: Wariner 16.2.2010, 21:51
правильнее будет:
Код
tUser.sNick:find"([%!]) and tUser.sNick:find"([@])"
Автор: DrakonSP 16.2.2010, 22:05
Цитата(Wariner @ 16.2.2010, 21:51)
правильнее будет:
Код
tUser.sNick:find"([%!])" and tUser.sNick:find"([@])"
Не работает
Автор: Nickolya 16.2.2010, 22:20
Условие and означает что в нике должны быть оба символа для его истинности. По-идее если надо проверить наличие одного из символов будет вернее использовать именно
Код
tUser.sNick:find"([%!@])"
Автор: DrakonSP 16.2.2010, 22:37
А ещё 1 вопросик не подскажите ?
Хочу поместить захват в переменную и...
Код
local sbansymbol = "[%!@4]"
function ValidateNickArrival(tUser)
if tUser.sNick:find"("..sbansymbol..")" then
Core.SendToUser(tUser,"*** Ваш ник содержит запрещённые символы!")
Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
Core.Disconnect(tUser)
end
if tUser.sNick:find"^%d+$" then
Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
Core.Disconnect(tUser)
end
end
и... ошибка
Цитата
Disallow.lua:4: unfinished capture
Меняю на:
Код
local sbansymbol = "([%!@4])"
function ValidateNickArrival(tUser)
if tUser.sNick:find""..sbansymbol.."" then
Core.SendToUser(tUser,"*** Ваш ник содержит запрещённые символы!")
Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
Core.Disconnect(tUser)
end
if tUser.sNick:find"^%d+$" then
Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
Core.Disconnect(tUser)
end
end
В чём трабла?
Автор: Setuper 16.2.2010, 22:41
Во-первых, символ ! не нуждается в экранировании.
Во-вторых, скобочки не нужно писать (если мы используем условие):
Код
if tUser.sNick:find"[!@]" then ...
Автор: Nickolya 16.2.2010, 23:03
Цитата(DrakonSP @ 16.2.2010, 22:37)
if tUser.sNick:find""..sbansymbol.."" then
В функцию можно передавать текстовый параметр целиком, без конкатенация, записывая его без скобок, во всех иных случаях скобки нужны (я предпочитаю их использовать всегда):
Код
if tUser.sNick:find(""..sbansymbol.."") then
Автор: DrakonSP 16.2.2010, 23:07
Не одна проблема так другая
Сделал так:
Код
local sbansymbol = "[!]" -- Запрещённые символы
function ValidateNickArrival(tUser)
if tUser.sNick:find""..sbansymbol.."" then
Core.SendToUser(tUser,"*** Ваш ник содержит запрещённые символы!")
Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
Core.Disconnect(tUser)
end
if tUser.sNick:find"^%d+$" then
Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
Core.SendToUser(tUser,"*** Обратная связь: skobyanka.sp.hub@gmail.com")
Core.Disconnect(tUser)
end
end
Итог: Не пускает вообще ни кого, т.е. ник к примеру DrakonSP, а скрипт срабытывает!
меняю
Код
"..sbansymbol.."
на
Код
[!]
всё работает
Я в недоумении...
Получаеться захват нельзя засунуть в переменную? А как же http://mydc.ru/ipb.html?act=findpost&pid=11000 всё работает?
Автор: Setuper 17.2.2010, 0:02
Цитата(Nickolya @ 16.2.2010, 23:03)
В функцию можно передавать текстовый параметр целиком, без конкатенация, записывая его без скобок, во всех иных случаях скобки нужны (я предпочитаю их использовать всегда):
естественно
Код
if tUser.sNick:find("[!@]") then
и
Код
if tUser.sNick:find"([!@])" then
различия очевидны. В первом случае скобки являются скобками метода find, во втором случае, скобки - это захват символа. Естественно их надо различать.
Как уже было сказано, если строка является
постоянным строковым литералом, то скобки можно опускать. Я предпочитаю опускать скобки почти везде, где это можно делать и не только у функции, но и просто по приоритету операций. Можно написать так:
Код
if ((a and b) or (c and d)) then
А можно тоже самое писать без скобок, зная приоритеты выполнения операций.
То же самое касается и
конструкторов таблиц. Пример:
Код
function F(tab)
for i,v in pairs(tab) do
...
end
end
Вызов этой функции может быть такой:
Код
F({1,2,3,4,5})
Но можно и по-другому вызвать (без скобок):
Код
F{1,2,3,4,5}
Данный "сахар" смотрится очень красиво и эффектно в некоторых случаях, поэтому я и опускаю скобки. Однако, кто не гонится за сокращение на пару символов кода, и кому нужна наглядность и практичность, а не элегантность, могут ставить скобки, - дело вкуса и понимания
Пример эффектной функции:
Код
function prnt(x)
if x then
Core.SendToAll(x)
return prnt
end
end
prnt "one" "two" "three"
Напишите в птохе и проверьте, что этот код действительно работает. Согласитесь, что если бы мы написали prnt("one")("two")("three"), то было бы тоже забавно, но не так, как 3 строковых литерала подряд
)))
Автор: DrakonSP 17.2.2010, 0:23
В общем я маленько въехал, но это всё равно для меня очень сложно.
Я понял, что там где можно обойтись без этих скобок лучше их опускать.
Но в моём случае они нужны, потому что захват не являеться постояным, а заключён в переменную.
Так?
Добавил скобки всё работает!
Скрипт можно перести в готовые...
Disallow.lua ( 560 байт )
: 48
-- Запрет символов в никах
-- Заперет ников состоящих только из цифр
Автор: Setuper 17.2.2010, 0:29
Код
if tUser.sNick:find(""..sbansymbol.."") then
это очень дурная привычка так писать!!! Вы даже не представляете насколько это вредно. Нужно всеми способами избавляться от лишних конкатенаций, а тут наоборот делают.
Почему не написать так:
Код
if tUser.sNick:find(sbansymbol) then
зачем делать лишнюю конкатенацию? Эту привычку надо искоренять! Не пойму, кто вас научил делать эту лишнюю конкатенацию? Ведь никто из скриптописателей данного форума так не пишет.
Автор: DrakonSP 17.2.2010, 0:33
Простите я не знал
Теперь знаю Спасибо
Автор: DrakonSP 21.2.2010, 23:34
Кто-нибудь может подсказать, в чём прикол?
Следующий код запрещает ники состоящие только из цифр
Код
if tUser.sNick:find"^%d+$" then
Core.SendToUser(tUser,"*** Ники состоящие только из цифр запрещены!")
Core.Disconnect(tUser)
end
Логически рассуждая можно запретить ники состоящие например из символа -
Следующим образом
Код
if tUser.sNick:find"^%-$" then
Core.SendToUser(tUser,"*** Ники состоящие только из символов запрещены!")
Core.Disconnect(tUser)
end
Символ - заэкранирован, и всё равно не работает
Почему?
Автор: Setuper 21.2.2010, 23:49
Потому что такое регулярное выражение ловит только один символ -, то есть ник, состоящий только из одного этого символа.
Нужно чтобы ловился один и более, для этого нужно поставить плюсик:
Код
if tUser.sNick:find"^%-+$" then
Ведь если бы мы в предыдущем примере не поставили плюсик:
Код
if tUser.sNick:find"^%d$" then
то ловилась бы тоже одна цифра, а не любое число.
Автор: DrakonSP 22.2.2010, 0:04
Не могу удержаться и спросить ещё кое что
Таким образом, что бы запретить ники состоящие только из - или . или z
Ну вообщем не важно какие это будут символы
Приходиться делать так:
Код
if tUser.sNick:find"^%-+$" then
Core.SendToUser(tUser,"*** Ники состоящие только из символов запрещены!")
Core.Disconnect(tUser)
end
if tUser.sNick:find"^z+$" then
Core.SendToUser(tUser,"*** Ники состоящие только из одной и той же буквы запрещены!")
Core.Disconnect(tUser)
end
Мне интересно узнать... Можно ли как то упростить код?
Чтобы просто добавлять символы в
Код
tUser.sNick:find"^z+$"
Автор: Nickolya 22.2.2010, 0:07
По-моему так:
Код
tUser.sNick:find"^([%-z])%1*$"
Автор: DrakonSP 22.2.2010, 0:11
Нет не фурычит
Автор: Setuper 22.2.2010, 12:21
Регулярные выражения в Lua не столь разнообразны, как регулярные выражения пёрла. Поэтому не всё возможно сделать
Автор: sphinx 22.2.2010, 17:17
Код
if tUser.sNick:match("^[%-]+$") or tUser.sNick:match("^[%.]+$") or tUser.sNick:match("^[z]+$") then
Автор: Setuper 22.2.2010, 17:58
Тогда уж без квадратных скобок и с использованием find, а не match
Код
local sNick = tUser.sNick
if sNick:find"^%-+$" or sNick:find"^%.+$" or sNick:find"^z+$" then