Андрeй
Зарегистрирован: 13.08.2007 Сообщения: 4
|
Добавлено: Вт Авг 14 2007 08:22 Заголовок сообщения: По алгоритму поиска |
|
|
Приветствую всех, требуется написать пограмму получающую содержимое некоторых тегов в html файле.
Имеется большой файл в нем теги А Б С повторяются последовательно. Нужно получить их значение, файл можно читать в буфер, потом искать теги в буфере, но что делать если искомое не вхлдит в буфер? я решил, что можно склеить n и n+1 буферы и поискать в них, но как-то это не универсально, юзаю регулярные выражения и c++.
Соответсвенно нужно какое-то другое решение. Подскажите пожалусто.
int main()
{
char *patternMailto="mailto:(.+?)>";
char *patternPhoneInternal=">([1-9])-([0-9][0-9][0-9])<";
regmatch_t p[2]; /* массив, в который будут заноситься результаты поиска */
regex_t regMailto, regPhoneInternal; /* переменная, для хранения преобразованного шаблона */
int i,j;
fprintf(stdout,"HTMLparser 0.01\n");
if(regcomp(®Mailto,patternMailto,0)) /* если возвращаемое значение не 0 - ошибка */
{
printf("Failed to compile regular expression!\n");
exit(1);
}
if(regcomp(®PhoneInternal,patternPhoneInternal,0)) /* если возвращаемое значение не 0 - ошибка */
{
printf("Failed to compile regular expression!\n");
exit(1);
}
int fd,rd,found;
unsigned int ii=0;
if((fd=open("/home/andrey_polyakov/1.html",O_RDONLY)) == -1)
{
fprintf(stderr,"Open failed:%s (errno=%d)\n",strerror(errno),errno);
exit(EXIT_FAILURE);
}
int bufferSize=128;
char *any, bufferRead[bufferSize], buffer0[bufferSize], buffer[bufferSize], buffer_all[bufferSize*2], tmp[]="email[", *letter;
char *b,bb[]=" ";
char aa[]="]";
//bb[1]="\0";
int ee=0;
bool step, switchBuffers;
switchBuffers=false;
step=true;
while ((rd=read(fd,bufferRead,bufferSize))>0)
{
memset (buffer_all,' ',bufferSize);
strncpy(buffer,bufferRead,bufferSize);
if (step)
{
if((rd=read(fd,buffer0,bufferSize))!=0)
{
memset (buffer0,' ',bufferSize);
}
if(rd==-1)
{
fprintf(stderr,"Read failed:%s (errno=%d)\n",strerror(errno),errno);
exit(EXIT_FAILURE);
}
strncpy(buffer,buffer0,bufferSize);
strncpy(buffer0,bufferRead,bufferSize);
//printf("buffer_all");
step=not step;
}
strncpy(buffer_all,buffer0,bufferSize);
strncpy(buffer_all+bufferSize,buffer,bufferSize);
//printf(buffer_all);
if(!regexec(®Mailto,buffer_all,2,p,0)) /* если возвращаемое значение не 0 - значит ничего не найдено */
{
printf("содержимое тега: ");
for(j=p[1].rm_so;j<p[1].rm_eo;j++)
putchar(buffer_all[j]);
putchar('\n');
}
if(!regexec(®PhoneInternal,buffer_all,2,p,0))
{
printf(" : ");
for(j=p[0].rm_so;j<p[0].rm_eo;j++)
putchar(buffer_all[j]);
putchar('\n');
}
//fprintf(stdout,"\n");
//memset (buffer0,' ',bufferSize);
strncpy(buffer0,buffer,bufferSize);
//memset (buffer,' ',bufferSize);
}
if(rd==-1)
{
fprintf(stderr,"Read failed:%s (errno=%d)\n",strerror(errno),errno);
exit(EXIT_FAILURE);
}
return 0;
} |
|