Русское сообщество по скриптингу

Проблема с фильтрацией имён Regex

Все вопросы по скриптингу для SourceMod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптингу для SourceMod.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sp плагина.

Проблема с фильтрацией имён Regex

Сообщение Accelerator » 20 дек 2012, 20:35

Хочу у себя на сервере запретить любые "разукраски" ника. Для этого использую такой код:
Код: Выделить всё
#include <sourcemod>
#include <regex>

new Handle:g_Regex = INVALID_HANDLE;

public OnPluginStart()
{
    g_Regex = CompileRegex("([a-zA-Zа-яА-Я ]+)");
}

public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
{
   return CheckName(client);
}

public bool:CheckName(client)
{
   if (IsFakeClient(client))
      return true;
   
   new String:clientname[128];
   GetClientName(client, clientname, sizeof(clientname));

   new String:buf[64];
   new index = MatchRegex(g_Regex, clientname);
   for (new i = 0; i < index; i++)
   {
      GetRegexSubString(g_Regex, i, buf, sizeof(buf));
   }

   if (strlen(buf) < 1)
   {
      KickClient(client, "Bad name!");
      return false;
   }
   SetClientInfo(client, "name", buf);
   
   return true;
}

Ник обрабатывается, но то, что идёт за плохим символом уже не читает.

Пример:
Ник: Tester 174 Test
На выходе: Tester
А должно быть: Tester Test

Подскажите что не так?
Последний раз редактировалось Accelerator 21 дек 2012, 13:15, всего редактировалось 3 раз(а).
Аватара пользователя
Accelerator
 
Сообщения: 9
Зарегистрирован: 18 июн 2011, 22:25
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Left 4 Dead 2

Re: Проблема с фильтрацией имён Regex

Сообщение mazdan » 22 дек 2012, 17:26

Можно сделать заменой на пробел вот так примерно (напишу на pawn т.к. source pawn не знаю)
[pawn]
  1. new len = strlen(name);

  2. for (i=0;i<len,i++)

  3. {

  4.                              //0-9                                                              A-Z                                                     a-z                                                     Space

  5.         if(!((name[i]>47 && name[i]<58) || (name[i]>64 && name[i]<91) || (name[i]>96 && name[i]<123) || name[i]!=32))

  6.                 name[i]=32 //Space

  7. }

  8.  
[/pawn]

UPD: не влезает красиво в блокноте нагляднее :D
я не пишу плагины на заказ!
Аватара пользователя
mazdan
 
Сообщения: 739
Зарегистрирован: 12 окт 2010, 14:44
Благодарил (а): 121 раз.
Поблагодарили: 211 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Проблема с фильтрацией имён Regex

Сообщение DJ_WEST » 25 дек 2012, 14:11

Через регулярку лучше делать, чем через циклы.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Проблема с фильтрацией имён Regex

Сообщение 6a6kin » 25 дек 2012, 14:16

DJ_WEST, а причина?
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Проблема с фильтрацией имён Regex

Сообщение Shadows In Rain » 25 дек 2012, 22:55

В топку регулярки, от них, в основном, головная боль. Контекстно-свободные парсеры рулят (читабельность + отлаживаемость + скорость).

С циклом можно очень просто сделать. Если нчиего не добавлять в строку, а только удалять — понадобятся две переменные — позиция чтения и позиция записи (всё в одном буффере).

Регэкспы удобны, когда нужно что-то сделать здесь-и-сейчас. Например, заменить 250 дефайнов на 250 констант. Для регулярной однообразной работы лучше писать парсер руками.
Аватара пользователя
Shadows In Rain
 
Сообщения: 115
Зарегистрирован: 08 авг 2011, 11:52
Откуда: Сибирь
Благодарил (а): 16 раз.
Поблагодарили: 138 раз.
Опыт программирования: Больше трех лет

Пред.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3