簡體   English   中英

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

[英]Finding all instances of a substring in a string

我的最后一個問題中,我問過如何解析HTML頁面中的鏈接。 由於尚未找到解決方案,因此我想在此期間嘗試了其他嘗試:搜索每個<a href= </a>為止。

現在,我的C有點生銹,但是我記得我可以使用strstr()來獲取該字符串的第一個實例,但是我如何得到其余的呢?

任何幫助表示贊賞。

PS:不。這不是學校作業或類似的作業。 請注意。

您可以使用循環:

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
  }
}

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

好的,原始答案和我的評論似乎需要更多信息,而不是在評論部分中舒服,因此我決定創建一個新答案。

首先,您正在嘗試做的一項編程任務,這需要一定的編程才能,具體取決於您的實際需求。

其次,提供了一些答案,建議您使用char查找和正則表達式循環。 這兩種方法都是非常容易出錯的方法,例如此處討論的那樣。

如今,解析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用途的不錯的教程。

恐怕在C語言中這會更加令人費解,但是想法是相同的,它是編程任務。

如果這是一些瑣碎的工作,則可以使用建議的strstr()或正則表達式搜索,而無需外部庫。 但是,請記住,根據您的確切任務,您很可能會丟失許多傳出鏈接或誤讀其內容。

C字符串只是指向第一個字符的指針。 要獲得下一場比賽,只需再次調用它,然后將指針傳遞到您獲得的上一場比賽的結尾即可。

這是我會做的(未經測試,僅是我的主意):

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()上確保所有args都不為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM