查找字符串中子字符串的所有实例

时间:2011-03-02 15:19:11

标签: c string

my last question中,我询问了如何解析HTML页面中的链接。由于我还没有找到解决方案,我认为我在此期间尝试了其他方法:搜索每个<a href=并复制其中的任何内容,直到我点击</a>

现在,我的C有点生疏,但我确实记得我可以使用strstr()来获取该字符串的第一个实例,但我如何得到其余的呢?

感谢任何帮助。

PS:不。这不是学校的家庭作业或类似的东西。你知道吗。

5 个答案:

答案 0 :(得分:4)

您可以使用循环:

char   *ptr = haystack;
size_t nlen = strlen (needle);

while (ptr != NULL) {
  ptr = strstr (ptr, needle);
  if (ptr != NULL) {
    // do whatever with ptr
    ptr += nlen;  // hat tip to @larsman
  }
}

答案 1 :(得分:3)

为什么不使用内置了非常好的HTML解析器的libxml

答案 2 :(得分:1)

好的,原来的答案和我的评论似乎需要比评论部分更多的信息,所以我决定创建一个新答案。

首先,你正在尝试做什么 IS 已经是一个编程任务,需要一些编程能力,具体取决于你的确切需求。

其次,提供了一些答案,建议您使用char查找和regexp循环。如上所述,这些都是可怕的容易出错的方法,例如here

现在解析HTML / XML的常用方法是使用为此设计的外部库。实际上,这些库现在已经成为标准的,并且在许多编程语言中它们已经内置。

根据您的特殊需求,我在C和XPath上都生锈了,但它应该大致如下:

  • 启动XML / HTML解析器。
  • 将HTML文档作为字符串
  • 加载到其中
  • 告诉解析器找到所有标记实例(使用XPath)
  • 它会返回给你一组“节点”
  • 处理循环中的节点集,根据需要处理每个标记

我找到了其他一些例子,也许这个更好:http://xmlsoft.org/example.html

正如你在那里看到的那样,有一个XML文档(没关系,因为HTML只是XML的子集,你的HTML文档也应该有用)。

在Python或类似的语言中,这将非常容易,在某些伪代码中,这看起来像这样:

p=new HTMLParser
p->load(my html document)
resultset=p->XPath_Search("//a") # this will find all A elements in the HTML document
for each result of resultset:
   write(result.href)
end for

这通常会写出文档中所有A元素的HREF部分。 关于你可以使用XPath的一个体面的教程是例如here

我担心在C中这会有点复杂,但这个想法是一样的,它是一个编程任务。

如果这是一些快速而肮脏的工作,您可以使用建议的strstr()或regexp搜索,而不使用外部库。但是,请记住,根据您的确切任务,您很可能会错过许多外发链接或误读其内容。

答案 3 :(得分:0)

C字符串只是指向第一个字符的指针;获得下一场比赛只需再次调用它并将指针传递给上一场比赛的结束。

答案 4 :(得分:0)

以下是我要做的事情(未经测试,只是我的想法):

char* hRef_start  = "<a href=";
char* hRef_end    = "</a>";

假设您的文字在

char text[1000];
char * first = strstr(text , hRef_start);
if(first)
{
    char * last = strstr(first , hRef_end);
    if(last)
         last--;
    else
         //Error here.

    char * link = malloc((last - first + 2) * sizeof(char));
    copy_link(link , first , last);
}

void copy_link(char * link , const char * first , const char * last)
{

     while(first < last)
     {
           *link = *first;
           ++first;
     }
     *link = 0;
}

您应该检查malloc()是否已成功,并确保free(),同时确保copy_link()没有任何参数null