Страниц (5): [1] 2 3 4 5 » |
|
Описание: Строковые функции. Поиск, удаление, замена. |
Поиск в теме | Версия для печати |
Kibor |
Отправлено: 15 Марта, 2018 - 05:19:12
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Добавил функции работы с текстом.
Новые Функции regexsearch и regexreplace регулярных выражений тут.
Ниже проще работающие, но не актуальные.
findtext - производит поиск подстроки заключенной между двумя указанными блоками текста. Либо от первого указанного блока до конца текста.
replacetext - производит поиск и замену подстроки.
deletetext - позволяет найти и удалить с текста указанные блоки текста или отдельные символы.
=========================================================================================
Пример findtext:
CODE:string TEXT="В этом тексте нам необходимо найти <-!это слово! и {такое тоже}. Поиск по тексту.";
char CTEXT[1000];
int nom, tnom=0;
int siz;
strcpy(#CTEXT[0], TEXT);
tnom=0;
loop()
{
if (findtext(#CTEXT[tnom], #nom, #siz, "<-!" & "!" | '{' & '}')==-1) goto er;
messagebox("Позиция от начала массива "+format(tnom+nom) + ". Длина найденного фрагмента "+format(siz) + ". Найдена фраза: "+format(#CTEXT[tnom+nom], siz));
tnom=tnom+nom;
}
er:;
Синтаксис:
1 параметр указатель на одномерный массив char в котором находится текст. Данный массив текста должен обязательно заканчиваться 0.
Если текст в массив копируется с помощью функции strcpy, 0 в конце ставится автоматически. Размер массива должен быть на 1 больше количества символов.
2 указатель на переменную int в которую запишется номер символа с которой начинается искомая фраза. Номер считается от начала поиска в массиве char.
То есть если поиск начинался с указателя
#CTEXT[100], то номер символа считается с сотого элемента массива CTEXT.
3 Указатель на int в который запишется длина найденной подстроки.
4 Данные параметры указывают между какими блоками происходит поиск.
Синтаксис:
"<-!" & "!"
Будет найден текст между <-! и !. Допускается тип string или char
Данные блоки можно комбинировать таким образом:
"<-!" & "!" | '{' & '}'
Данная запись означает что будет найден текст между
(<-! найденный текст !) ИЛИ ({ найденный текст })
Функция findtext возвращает
1 если текст найден между обоими блоками
0 если текст найден от первого блока и до конца текста
-1 текст не найден
Использовать данную функцию следует в цикле. За один вызов она возвращает один найденный фрагмент.
Для поиска следующего необходим повторный вызов функции с указанием смещения в указателе на массив char.
Еще пример поиска в тексте конкретно указанной фразы. В этом случае вторым блоком указываем пустую строку:
CODE:string TEXT="В этом тексте нам необходимо найти <-!это слово! и {такое тоже}. Поиск по тексту.";
char CTEXT[1000];
int nom, tnom=0;
int siz;
strcpy(#CTEXT[0], TEXT);
//До искомого блока
tnom=0;
loop()
{
if (findtext(#CTEXT[tnom], #nom, #siz, "<-!" & "")==-1) goto er;
messagebox("Позиция от начала массива "+format(tnom+nom-size("<-!")) + ". Длина найденного фрагмента "+format(siz+size("<-!")) + ". Найдена фраза: "+format(#CTEXT[tnom+nom-size("<-!")], siz+size("<-!")));
tnom=tnom+nom;
}
er:;
//После искомого блока
tnom=0;
loop()
{
if (findtext(#CTEXT[tnom], #nom, #siz, "<-!" & "")==-1) goto er1;
messagebox("Позиция от начала массива "+format(tnom+nom) + ". Длина найденного фрагмента "+format(siz) + ". Найдена фраза: "+format(#CTEXT[tnom+nom], siz));
tnom=tnom+nom;
}
er1:;
======================================================================================================================
Пример replacetext:
"<-!" Удалится, так как второй блок, которым заменять имеет пустую строку
"{" заменится на "EEEEE"
CODE:string TEXT="В этом тексте нам необходимо заменить<-!это слово! и {такое тоже. Поиск по тексту.";
char CTEXT[1000];
int nom=0, tnom=0;
strcpy(#CTEXT[0], TEXT);
loop()
{
if (replacetext(#CTEXT[tnom], #nom, "<-!" ~ "" | '{' ~ "EEEEE")==0)goto er;
tnom=tnom+nom;
messagebox(format(tnom)+" "+format(#CTEXT[0]));
}
er:;
Синтаксис:
1 параметр указатель на одномерный массив char в котором находится текст. Данный массив текста должен обязательно заканчиваться 0.
Если текст в массив копируется с помощью функции strcpy, 0 в конце ставится автоматически. Размер массива должен быть на 1 больше количества символов.
2 указатель на переменную int в которую запишется номер символа следующего за заменившей фразой. Номер считается от начала поиска в массиве char.
То есть если поиск начинался с указателя
#CTEXT[100], то номер символа считается с сотого элемента массива CTEXT.
3 Данные параметры указывают какие блоки будут заменены и чем.
Синтаксис:
"<-!" ~ "!"
Будет найден текст <-! и заменен на !. Допускается тип string или char
Данные блоки можно комбинировать таким образом:
"<-!" ~ "!" | '{' ~ '}'
Данная запись означает что будет найден и заменен текст
(<-! на !) ИЛИ ({ на })
Функция replacetext возвращает
1 если текст найден и заменен
0 текст не найден
Использовать данную функцию следует в цикле. За один вызов она возвращает один замененный найденный фрагмент.
Для замены следующего необходим повторный вызов функции с указанием смещения в указателе на массив char.
======================================================================================================================
Пример deletetext:
CODE:string TEXT="В этом тексте нам необходимо удалить слова жвачка и вирус. Удаление слов вирус жвачка.";
char CTEXT[1000];
strcpy(#CTEXT[0], TEXT);
messagebox(format(#CTEXT[0]));
deletetext(#CTEXT[0], "жвачка" | "вирус");
messagebox(format(#CTEXT[0]));
Синтаксис:
1 параметр указатель на одномерный массив char в котором находится текст. Данный массив текста должен обязательно заканчиваться 0.
Если текст в массив копируется с помощью функции strcpy, 0 в конце ставится автоматически. Размер массива должен быть на 1 больше количества символов.
Удаление происходит начиная от указанного индекса массива.
2 Удаляемые блоки текста. Допускается string или char.
Данные блоки можно комбинировать
"жвачка" | "вирус"
и так далее.
Возвращает количество удаленных блоков. |
|
|
Kibor |
Отправлено: 15 Марта, 2018 - 06:03:41
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Dantes3000 пишет: я так понял - эти символы можно самому указывать или только эти использовать можно?
Это пример. Любой текст.
Хоть
CODE:string TEXT="В этом тексте нам необходимо найти <-!это словоA! и {такое тоже}. Поиск по тексту.";
char CTEXT[1000];
int nom, siz;
strcpy(#CTEXT[0], TEXT);
if (findtext(#CTEXT[0], #nom, #siz, "найти" & formatic(65))!=-1)
{
messagebox(format(#CTEXT[nom], siz));
}
(Добавление)
Пример отсечения заголовка при приеме загруженного кода страницы с интернета.
CODE:char s[100];
char p[9999];
//if (opensocket ("176.9.203.18", 80)==1)//Можно по ip
if (opensocket ("kibor-bot.com", 80)==1)//Если открыли сокет
{
strcpy(#s[0], "GET http:/"+"/kibor-bot.com/stat/programmed-autoclicker.php HTTP/1.0");//Формируем GET запрос
int sizf=size(#s[0]);//Узнаем номер в массиве конца строки с GET запросом
//Записываем \r\n\r\n - конец заголовка
s[sizf]=formatic(13);s[sizf+1]=formatic(10);s[sizf+2]=formatic(13);s[sizf+3]=formatic(10);
if (sendhtml(#s[0], sizf+4)>0)//Если отправили запрос
{
recvhtml(#p[0], 9999);//читаем ответ
messagebox (format(#p[0]));//с заголовком
int nom, siz;
if (findtext(#p[0], #nom, #siz, formatic(13)+formatic(10)+formatic(13)+formatic(10) & "")!=-1)
{
messagebox(format(#p[nom], siz));//без заголовка
messagebox(format(#p[0], nom-4));//только заголовок
}
}
closesocket ();//Закрываем
} |
|
|
Kibor |
Отправлено: 15 Марта, 2018 - 08:33:55
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
AdryV пишет: потому что без у меня ошибка
очень информативно. пример мой работает?
AdryV пишет: что бы искать нужный текст в ответе сайта всегда нужно будет искать с formatic(13)+formatic(10)+formatic(13)+formatic(10) ?
Эти символы отделяют тело от заголовка.
К остальному поиску не имеет отношения.
Если после заголовка в теле чистая инфа, то можно смело так отделять и оставшееся заносить в переменную и использовать. |
|
|
AdryV |
Отправлено: 15 Марта, 2018 - 08:37:05
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
Kibor пишет: очень информативно. пример мой работает?
CODE:char s[100];
char p[9999];
//if (opensocket ("176.9.203.18", 80)==1)//Можно по ip
if (opensocket ("kibor-bot.com", 80)==1)//Если открыли сокет
{
strcpy(#s[0], "GET http:/"+"/kibor-bot.com/stat/programmed-autoclicker.php HTTP/1.0");//Формируем GET запрос
int sizf=size(#s[0]);//Узнаем номер в массиве конца строки с GET запросом
//Записываем \r\n\r\n - конец заголовка
s[sizf]=formatic(13);s[sizf+1]=formatic(10);s[sizf+2]=formatic(13);s[sizf+3]=formatic(10);
if (sendhtml(#s[0], sizf+4)>0)//Если отправили запрос
{
recvhtml(#p[0], 9999);//читаем ответ
messagebox (format(#p[0]));//с заголовком
int nom, siz;
if (findtext(#p[0], #nom, #siz, "")!=-1)
{
messagebox(format(#p[nom], siz));//без заголовка
messagebox(format(#p[0], nom-4));//только заголовок
}
}
closesocket ();//Закрываем
}
вот так у меня ошибка.....
если вернуть formatic(13)+formatic(10)+formatic(13)+formatic(10) &
то все норм... |
|
|
Kibor |
Отправлено: 15 Марта, 2018 - 08:41:01
|
Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Самодеятельность.. По правилам синтаксиса надо два блока.
AdryV пишет: if (findtext(#p[0], #nom, #siz, "")!=-1)
Kibor пишет: Еще пример поиска в тексте конкретно указанной фразы. В этом случае вторым блоком указываем пустую строку:
CODE:
string TEXT="В этом тексте нам необходимо найти <-!это слово! и {такое тоже}. Поиск по тексту.";
char CTEXT[1000];
int nom, tnom=0;
int siz;
strcpy(#CTEXT[0], TEXT);
//До искомого блока
tnom=0;
loop()
{
if (findtext(#CTEXT[tnom], #nom, #siz, "<-!" & "")==-1) goto er;
messagebox("Позиция от начала массива "+format(tnom+nom-size("<-!")) + ". Длина найденного фрагмента "+format(siz+size("<-!")) + ". Найдена фраза: "+format(#CTEXT[tnom+nom-size("<-!")], siz+size("<-!")));
tnom=tnom+nom;
}
er:;
//После искомого блока
tnom=0;
loop()
{
if (findtext(#CTEXT[tnom], #nom, #siz, "<-!" & "")==-1) goto er1;
messagebox("Позиция от начала массива "+format(tnom+nom) + ". Длина найденного фрагмента "+format(siz) + ". Найдена фраза: "+format(#CTEXT[tnom+nom], siz));
tnom=tnom+nom;
}
er1:;
(Добавление)
Вы суть не поняли. Естественно что надо указывать то что мы ищем.
А ищем мы
/r/n/r/n
границу заголовок ----- тело
то есть formatic(13)+formatic(10)+formatic(13)+formatic(10)
Вы искомое выкинули) + ошибка синтаксиса. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (5): [1] 2 3 4 5 » |
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0) |
« О программе Кибор » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|