Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 5.33 Работа с текстом. Поиск подстроки между указанными блоками, удаление или замена указанной подстроки и символов.

Страниц (5): [1] 2 3 4 5 »
 

1. Kibor - 14 Марта, 2018 - 22:19:12 - перейти к сообщению
Добавил функции работы с текстом.

Новые Функции 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.
Данные блоки можно комбинировать
"жвачка" | "вирус"
и так далее.
Возвращает количество удаленных блоков.
2. Dantes3000 - 14 Марта, 2018 - 22:52:27 - перейти к сообщению
 Kibor пишет:
Синтаксис:
"<-!" & "!"

я так понял - эти символы можно самому указывать или только эти использовать можно?
3. Kibor - 14 Марта, 2018 - 23:03:41 - перейти к сообщению
 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 ();//Закрываем
}
4. AdryV - 15 Марта, 2018 - 01:30:10 - перейти к сообщению
 Kibor пишет:
Пример отсечения заголовка при приеме загруженного кода страницы с интернета.

я так понял что бы искать нужный текст в ответе сайта всегда нужно будет искать с formatic(13)+formatic(10)+formatic(13)+formatic(10) ?
потому что без у меня ошибка....
5. Kibor - 15 Марта, 2018 - 01:33:55 - перейти к сообщению
 AdryV пишет:
потому что без у меня ошибка

очень информативно. пример мой работает?

 AdryV пишет:
что бы искать нужный текст в ответе сайта всегда нужно будет искать с formatic(13)+formatic(10)+formatic(13)+formatic(10) ?

Эти символы отделяют тело от заголовка.
К остальному поиску не имеет отношения.

Если после заголовка в теле чистая инфа, то можно смело так отделять и оставшееся заносить в переменную и использовать.
6. AdryV - 15 Марта, 2018 - 01:37:05 - перейти к сообщению
 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) &
то все норм...
7. Kibor - 15 Марта, 2018 - 01:41:01 - перейти к сообщению
Самодеятельность.. По правилам синтаксиса надо два блока.
 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)
Вы искомое выкинули) + ошибка синтаксиса.
8. AdryV - 15 Марта, 2018 - 01:59:54 - перейти к сообщению
все разобрался спасиб Подмигивание
9. Dantes3000 - 15 Марта, 2018 - 09:57:56 - перейти к сообщению
CODE:
string text="уда? ли? ли?";
char ch[250];
strcpy(#ch[0], text);

messagebox(format(#ch[0]));
deletetext(#ch[0], "?");
messagebox(format(#ch[0])); //почему последний не удаляется?
10. Kibor - 15 Марта, 2018 - 10:24:16 - перейти к сообщению
 Dantes3000 пишет:
почему последний не удаляется?

Уже удаляется.

Powered by ExBB FM 1.0 Final