正則在小偷程序中的應用

幾乎所有的編程的語言都會提供一些方法讓你可以快速獲取其他網站的內容。尤其對於一些實時更新的數據,如果能夠及時抓取到自己的網站中無疑是一筆比較實用的資源。但是這些抓取的方法,是抓取網頁中的所有源碼。這些未經修飾的數據肯定不是你想要的,所以你需要對這些數據進行處理。

一、獲取源碼

$content = file_get_contents("http://blog.csdn.net/shanshan209/?viewmode=contents“);

php中抓取頁面源碼的函數是 file_get_contents.你只要提供網頁的url就可以了。這裏爲了方便起見,抓取的數據就是我博客的文章列表了。

輸出一下$content 的內容你會發現全部都是亂碼?那是因爲你編碼格式沒有轉換。 $content = iconv("utf-8","gb2312//ignore",$content);在解碼中記得加上//ignore用來容錯,不然它會遇到錯誤就會自動中斷了,截取的內容就不完整了。

ps:有些主機服務商把php的allow_url_fopen選項是關閉了,就是沒法直接使用file_get_contents來獲取遠程web頁面的內容。那就是可以使用另外一個函數curl。你可以利用function_exists函數來檢查 file_get_contents函數是否存在。

if(function_exists('file_get_contents')) {
$file_contents = file_get_contents($url);
} else {
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
}
二、對截取過來的數據進行處理

輸出$content 你會發現這些東西並非都是你需要的東西。你只要要博客列表的中的文章名。怎麼對數據進行有效處理那?這時候我們可以用正則去匹配。

preg_match_all("/<div class=\\\"article_title\\\">(.+?)<\/div>/s",$content,$article_list);

獲取div爲article_title的內容。(.+?)用的是懶惰匹配原則,就是儘可能匹配少的字符。

preg_match只匹配一次,preg_match_all是全文匹配,即所有跟表達式一致的都找出來。


三、獲取自己要用的數據

$out=array();
            foreach($article_list[1] as $i=>$key){
                $out[$i]=trim(strip_tags($key));
            }
去除html標記,最終的數據是個數組$out


ps:以上只是一個小實例,真實情況下可能比這個複雜很多。當然我們到時候見招拆招就ok了



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章