http協議使用廣泛,相應的,c++在這塊需求也開始增加。乙個好的解析庫可以達到事半功倍的效果,在此貼出我的解析庫的**,方便新手朋友們使用。
重點說說這個庫的使用方法,我就說說 hhtmlparse::getlocalip 則函式的實現,方法大多類似。
1、字串定義
std::string page, match;
page.resize (512);
match.resize (16);
其中 page 用作儲存 html **, match 用作儲存匹配的字串,也就是網頁中需要獲取的資料。由於訪問的資料不大,所以 page 設定 512 位元組足夠。這兒也可以不用設定大小的, urlgethtml 實現的比較智慧型,可以自動擴充套件大小。設定乙個大小只是可以減少記憶體 i/o ,提高執行速度。另外這兒也給 match 設定乙個大小。對於ip位址來說,16位元組足夠了。
2、獲取網頁html**
這句**用於建立乙個解析物件,傳入的資料為網頁html字串。if (!hhtmlparse::urlgethtml (l"", page)) return false;
3、建立解析物件
hhtmlparse hp (page);
這裡我們看看ip138的網頁**:
您的ip是:[123.144.*.*] 來自:xx市 聯通
4、設定當前解析位置
hp.setpos ("");
在這個解析庫內部維護著乙個字元指標,假如說網頁前面的都解析過了,需要解析後面的,那就在解析時給字元指標賦值,然後下次解析時從字元指標位置開始解析,既方便網頁處理,也提高解析速度,一舉兩得。這行**的意思就是將內部維護的位址放在 這兒,下次呼叫時直接從這兒開始了。
5、獲取匹配字串,也就是ip位址
hp.matchstring ("%*[^0-9]%[0-9.]", match);
這兒就是獲取匹配字串的**了 ,第乙個引數為sscanf函式需要的那個字串,match返回匹配的結果。簡要說說這個字串的意思,需要深究的自行bing。
%*[^0-9] %*表示跳過,不匹配,表示匹配的內容,^表示非,0-9表示那十個數字。連起來的意思就是跳過所有不是0-9的字元。
%[0-9.] %表示匹配,0-9.表示匹配的內容為那十個數字和小數點,一直到非0-9或小數點為止。
**到這兒就已經獲取了匹配的ip了,接下來的內容就是簡單的處理了。
6、簡單處理並返回
ip.clear ();
ip = match.c_str ();
return true;
由於匹配是通過 const_cast(s.c_str()) 賦值(這行**可以在 hhtmlparse::matchstring 函式中找到),所以,在執行步驟6這段**前,呼叫 match.length() 實際上返回的是不固定值,雖然不固定但是有資料。所以,假如非得在 const_cast(s.c_str()) 之後獲取字串長度,只能用lstrlen。
這幾行**大家應該都懂,簡要說說第二行,意思是呼叫 std::string 的過載函式 operator=(char*) ,這樣可以重新整理 std::string 的長度,執行第二行**之後,ip中的資料可以直接呼叫 length() 來獲取長度了。
使用步驟描述完畢,同學們如果需要解析其他網頁在相應地方修改就行了。另外, setpos 和 matchstring 並不是只能呼叫一次的,只要找網頁方便,並且保證物件內部維護的指標還沒到末尾,就可以重複呼叫這些函式了。
分享乙個c 的json解析庫
7月25日更新 新增關於如何讀取json的值的內容。先貼上 哈 來自github lxjson a json library in cpp 附 json是什麼?怎麼用啊?如何驗證我寫的json是否正確啊?有以下幾點是我認為它的優勢所在 explicit json noexcept explicit ...
乙個C 的 XML 解析程式
乙個c 的 xml 解析程式 下面是乙個示例 xml 檔案 在 程式 include to get printf function include to get free function include xmlparse r.h intmain intargc,char argv 載入xml xm...
乙個html介面與另外乙個html介面之間傳遞資料
兩個html介面之間的資料傳遞出了通過後台邏輯進行傳遞之外,如果通過ajax來傳遞的話,一些後台傳遞過來的值不能夠正確的傳遞到前台介面上面去。有一種方法,就是先將後台傳遞進來的資料先放到乙個隱藏的文字框中,然後傳遞給另外乙個介面文字框中的內容,就可以做到兩個頁面直接的資料傳遞。隱藏文字框 ajax請...