按标签分割html

时间:2013-07-30 09:16:52

标签: c split

我想通过标记分隔符将html页面拆分为多个部分:例如<img<div>。 我尝试了以下代码,但它不起作用:

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之外,我还能使用其他方法吗?

3 个答案:

答案 0 :(得分: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

接下来的事件。

此外,您的行

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

会因为没有分配给指针的内存而崩溃。

答案 1 :(得分: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");

答案 2 :(得分:0)

strtok的第二个参数是分隔符字符列表。其中每个都将用于将字符串拆分为标记。我认为它不会像你认为的那样......

如果您想将html文件解析为令牌,可以查看lex ...

您想要的输出是多少?你有输入的测试用例吗?

您的代码应该生成以下内容:

<强>输入

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

<强>输出:

  • “”
  • “HT”
  • “L&gt;” 中
  • “src = \”test.pn“
  • “\”/&gt;“中
  • “/ HT”
  • “L&gt;” 中

我不知道那是你想要的......