|
Вопрос # 623/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты! Мне хотелось бы чтобы вы научили меня парсить! А именно я написал простенького бота для irc, это было не сложно, т.к. компонент не такой уж и сложный в изучении. Но мне хотелось бы его немного автоматизировать и отлавливать и обрабатывать входящие сообщения, чтобы например определенное слово служило ему сигналом! (Например "help") Заранее благодарен!
Приложение: Переключить в обычный режим-
-
- procedure TForm1.IdIRC1Message(Sender: TObject; AUser: TIdIRCUser;
- AChannel: TIdIRCChannel; Content: String);
- begin
- Memo1.Lines.Add('<'+AUser.Nick+'> ' + Content);
- end;
 |
Вопрос задал: Fen-Omen (статус: Посетитель)
Вопрос отправлен: 10 июня 2007, 23:23
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Fen-Omen!
Для того, что бы "парсить" достаточно следующих функций
function Copy(s:string;start,count:integer):string;
эта функция вытянет с строки s count символов начиная с позиции start. Если символов будет нехватать, то будет взято скоко, скоко есть.
Delete(s:string;start,count:integer);
эта процедура удадит с строки s count символов начиная с позиции start.
function pos(p,s:string):integer;
производит поиск подстроки p в строке s. Если найдено - возращает позицию. Если нет, возвращает ноль.
Функция ищет только первое вхождение.
Для поиска последующие надо пользоваться функцией
function pos(p,s:string; posstart:integer):integer;
которая начинает свой поиск с позиции posstart. К сожалению появилась только в 7 делфи.
Также неплохо будет знать о функции Trim(s:string):string;
Эта фунция возвращает строку без конечных пробелов.
Length(s:string):integer; - возвращает длину строки. только неверте сишникам, что эта функция медлена и её надо заменять на присваивание переменной и выносить за пределы цикла. На самом деле это может только замедлить. Почему так? это с отладчиком посидите, посмотрите дизасемблированный код - поймёте.
Этих функций достаточно, что бы писать парсеры любой сложности.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 июня 2007, 02:55
Оценка за ответ: 5
Комментарий к оценке: Спасибо за помощь!
|
Ответ #2. Отвечает эксперт: Denisss
Здравствуйте, Fen-Omen!
Чтобы определить наличие слова 'help' в тексте, нужно воспользоваться функцией Pos:
if (Pos('HELP', UpperCase(Content)) > 0) then
...
Если же определенным сигналом служит сообщение, содержащее только слово 'help', то:
if (UpperCase(Content) = 'HELP') then
...
Функция UpperCase преобразует всю строку в верхний регистр (это нужно, чтобы пользователь мог также написать и 'Help' или 'hElp' - в общем, так, как ему задумается.
Данная функция будет работать только с латинскими символами. Для преобразования строки, содержащей кириллицу в верхний регистр, нужно использовать функцию AnsiUpperCase.
Если важен регистр, то функцию UpperCase нужно убрать и сравнивать не с 'HELP', а с 'help'.
Вместо UpperCase (или AnsiUpperCase) можно воспользоваться функцией LowerCase (или AnsiLowerCase) - она преобразует строку в нижний регистр. Тогда нужно будет сравнивать строку с 'help'.
Удачи!
 |
Ответ отправил: Denisss (статус: 2-ой класс)
Время отправки: 11 июня 2007, 12:20
Оценка за ответ: 5
Комментарий к оценке: Denisss, все стало понятней! Огромная благодарность!
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 19:27: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|