![](/img/trans.png)
[英]Using strstr to find all instances of substring results in weird string formatting
[英]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都感到不滿意,但是它應該大致像這樣工作:
我發現了其他一些示例,也許這是更好的示例: 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.