2013-07-30 64 views
0

我想通過標籤分隔符將HTML頁面拆分爲小塊:如<img<div>。 我嘗試下面的代碼,但它不工作:按標籤分割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

由於達人已經發布,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 

下一個occurances。

此外,您的線路

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

會崩潰,因爲你沒有分配給指針的內存。

+0

是的,你是對的,現在它提取正確,但我想添加到數組的所有結果不起作用的部分。我只需要數組中的第四個元素。你知道還有其他的方式來保存第四次發生而不使用數組嗎?謝謝 – 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> 

輸出:

  • 「」
  • 「HT」
  • 「L> 「
  • 」 SRC = \ 「test.pn」
  • 「\」/>」
  • 「/ HT」
  • 「L>」

我有點不認爲是你想要什麼...

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");