上次說到做關於選課網的軟件。現在說幹就幹了~
大概思路說是:
通過某特定頁面獲取返回信息,然後再從HTML文本里截取東西。
看似很簡單的東西,做起來可不容易。
首先CURL搞得不錯(多虧當年用了幾天搞出來的新PHP),得到頁面很隨意。
之後是去HTML標記和各種空格,函數如下:
string strip_tags(string $htmlpage); //去HTML標記,還可以加參數,要求保留某些標記
string preg_replace("//s/","",$str); //去除str中一切空白字符,什麼tab,什麼空格,什麼換行。。這樣的好處就是把所有文字都邊成一片了。。。。
之後是內容的摘取。
原來也想用正則表達式來着,perl兼容的正則表達式似乎很高效也很NB,而ereg比較弱,也稍微簡單點。
但是蛋疼的是,PHP中如果要正則中文,就要用16進制編碼來找它們。。。於是用了一晚上探究其中原因
事實上PHP什麼的雖然都可以顯示中文頁面,但它的字符處理都是按單字節字符處理的…然而GB2312或者GBK中,漢字都是雙字節表示,於是你要想處理漢字,必須將漢字想象成2個BT的單字符組成的東西…而在UTF-8中,因爲支持的字符更多,它用三個字節表示字符…於是換算變得更加複雜。。。。
正當我想放棄的時候,mb_打頭的函數給我了線希望──它幫我搞定了所有寬字符的問題,只要記得UTF8中的中文是3個字節就OK了。但是perg不支持這種東西,只有mb_ereg系列。。。。在我試驗N次蛋疼無數之後,決定不用正則了。。自己寫字符串操作吧!
大概用到了以下幾個函數:
需要注意的是,所有數字的表示,都認爲漢字是3個字符(UTF8下),所以如果要截3個漢字,應該讓$lenth=9纔可以。
然後用FOR循環讀取N多網頁,感覺速度還是很快的,30秒能顯示1000多條。。。設計得當的話,估計還是可以用起來的。
值得一提的是,PHP裏的數組太給力了!它的標號可以是有意義的名字,類似c中的結構體一樣了。。。
比如:
下一步計劃:從csv文件中讀取一學期的所有課程到數據庫,裏面有寶貴的上課時間,之後通過課程ID來與網上的數據聯繫。
至少要建立2個表了。。。從現在的情況來看。。。。
但是最鬱悶的是在發送網頁請求的時候,需要使用bsid=xxxxxxxx,是一個6位的數字,這個實在是沒規律,只能窮舉了…
除非。。。找到網絡中心。。。。。算了。。。
希望日後能順利一些!