提取两个分隔符之间的数据

3

我只是想知道是否可能选择两个定界符(定界符是一个字符串)之间存在的数据。

例如,原始字符串如下:

<message%20type%3D"info"%20code%3D"20005">%20<text>Conference%20successfully%20modified</text>%20<data>0117246</data>%20%20</message>%20

我希望获取在<text>标签中的数据。需要获取的字符串可能不同,也可能像这样:
<message%20type%3D"info"%20code%3D"20001">%20<text>Conference%20deleted</text%20%20<vanity>0116976</vanity>%20</message>%20<message%20type%3D"info"%20code%3D"20002">%20<text>Number%20of%20conferences%20deleted</text>%20<data>1</data>%20%20</message>%20  

但我总是需要在<text>标记之间的数据。

所以在C语言中是否可能或者是否有其他替代方案?


可能是parsing the value in between two XML tags的重复问题。 - tripleee
第二个例子中的错误关闭标签</text是故意而有代表性的吗? - tripleee
我看到你的问题已经完全改变了..请不要改变问题..这会导致答案看起来是错误的。 - Gopi
XML在同一文档甚至同一行中肯定可以包含多个相同标签的出现。 - tripleee
我需要在字符串中转义双引号。有没有一种动态转义的方法? - k.dev
显示剩余5条评论
2个回答

7

我会选择strstr()

例如:

#include <stdio.h>
#include <string.h>

int main(void) {
    char data[] = "<message%20type%3D\"info\"%20code"
                  "%3D\"20005\">%20<text>Conference%"
                  "20successfully%20modified</text>%"
                  "20<data>0117246</data>%20%20</mes"
                  "sage>%20";
    char *p1, *p2;
    p1 = strstr(data, "<text>");
    if (p1) {
        p2 = strstr(p1, "</text>");
        if (p2) printf("%.*s\n", p2 - p1 - 6, p1 + 6);
    }
    return 0;
}

4

有两个函数strtok()strtok_r()可以根据分隔符提取数据。

char a[100] = "%20Conference%20successfully%20modified%200117246%20%20%20";
char *p = strtok(a,"%");
while(p != NULL)
{
  // Save the value in pointer p
  p = strtok(NULL,"%");
}

如果您希望保持字符串 a 不变,则需要有一个单独的数组 bchar b[100] 并将字符串复制到 b
strcpy(b,a);

代码和输出:

#include <stdio.h>

int main(void) {
    char a[100] = "%20Conference%20successfully%20modified%200117246%20%20%20";
    char *p = strtok(a,"%");
    char n[20];
    while(p != NULL)
    {
      strcpy(n,p);
      p = strtok(NULL,"%");
      printf("%s\n",n);
    }
    return 0;
}

输出:

20Conference
20successfully
20modified
200117246
20
20
20

注意: strtok() 函数会修改传入的字符串。请参考 man 手册:http://linux.die.net/man/3/strtok_r


我总是需要在<text>标签之间存在的数据。你正在解决一个不同的问题。 - weston
@weston 我已经添加了一个 PS 请检查一下.. 如果是这样的话,那么初始字符串需要被保存,而传递给 strotk() 的字符串应该是另一个..我正在解决其他问题,这就是 OP 想要的解决方案,只是需要添加一个条件:初始字符串不应该被更改。 - Gopi
OP想要提取标签之间的文本,但你的示例是以他们想要结束的内容开头,然后通过“%”将其分解。 - weston
哦,我没有意识到问题已经改变了。这就解释了。 - weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接