2013-07-30 2 views
0

Я хочу разделить html-страницу на куски по разделителю тегов: например <img или <div>. Я пробовал следующий код, но он не работает:split html по тегам

char source[MAXBUFLEN + 1]; 
FILE *fp = fopen("source.html", "r"); 
if (fp != NULL) 
{ 
    size_t newLen = fread(source, sizeof(char), MAXBUFLEN, fp); 
    if (newLen == 0) { 
     fputs("Error reading file", stderr); 
    } else { 
     source[++newLen] = '\0'; /* Just to be safe. */ 
    } 
} 
fclose(fp); 

//not working 
char* strArray[10]; 
int i = 0; 
char *token = strtok(source, "<img"); 
while(token != NULL) 
{ 
    strcpy(strArray[i++], token); 

    token = strtok(NULL, "<img"); 
} 

printf("%s\n", strArray[3]); 

Что я делаю неправильно? Есть ли другой метод, который я могу использовать, кроме strtok?

+0

Второй аргумент 'strtok()' на самом деле список всех разделителей вы заинтересованы. Я рекомендовал бы расщепление на "<", а затем проверить, начинается ли токен с 'img' –

+0

Если вам действительно не нужно это реализовать, я предлагаю вам проверить libxml: http: //www.xmlsoft.org /. В противном случае вам придется использовать strtok для синтаксического анализа для «<», затем проверить свой тег и затем проанализировать «>». –

ответ

2

Как Daren уже опубликовал, strtok() не делает то, что вы хотите. Вы можете использовать

char *ptr = strstr(source, "<img"); 

вместо того, чтобы найти первый тег, а затем

ptr = strstr(ptr+4, "<img"); // search starts direcly behind the previous "<img" 
           // maybe you can find a better offset 

в течение следующих появлений.

Кроме того, ваша линия

strcpy(strArray[i++], token); 

врежется, потому что у вас нет выделенной памяти указателю.

+0

Да, вы правы, теперь он извлекает правильно, но часть, которую я хочу добавить в массив, все результаты не работают. Мне нужен только 4-й элемент из массива. Вы знаете какой-либо другой способ сохранить только 4-е вхождение без использования массива? спасибо – ShaMora

+0

Вы имеете в виду 4-й тег? Затем вы можете просто сделать цикл, например 'for (i = 0; ptr = source; i <4 && (ptr = strstr (ptr,"

+0

Я получаю ошибку компиляции в этой строке :( – ShaMora

0

Второй аргумент strtok - это список разделителей. Каждый из них будет использоваться для разделения строки на токены. Я не думаю, что это то, что вы думаете, что делает ...

Если вы хотите, чтобы пойти и разобрать HTML-файл в лексемы, вы можете посмотреть в lex ...

Что вы желаемый результат? У вас есть тестовый пример для ввода?

Ваш код должен произвести следующие действия:

вход:

<html><img src="test.png"/></html> 

выход:

  • ""
  • "ХТ"
  • «л> "
  • " SRC = \ "test.pn"
  • "\" />»
  • "/ ХТ"
  • "л>"

я как-то не думаю, что это что вы хотите ...

2
char *strtokByWord_r(char *str, const char *word, char **store){ 
    char *p, *ret; 
    if(str != NULL){ 
     *store = str; 
    } 
    if(*store == NULL) return NULL; 
    p = strstr(ret=*store, word); 
    if(p){ 
     *p='\0'; 
     *store = p + strlen(word); 
    } else { 
     *store = NULL; 
    } 
    return ret; 
} 
char *strtokByWord(char *str, const char *word){ 
    static char *store = NULL; 
    return strtokByWord_r(str, word, &store); 
} 

заменить

char *token = strtok(source, "<img"); 
... 
token = strtok(NULL, "<img"); 

в

char *token = strtokByWord(source, "<img"); 
... 
token = strtokByWord(NULL, "<img"); 
Смежные вопросы