因爲須要,要寫一個簡單的PHP採集程序,照例是到網上找了一堆教程,而後照貓畫虎,但是發現網上的教程全是似是而非,沒有一個真正能用的。苦想了幾天,終於弄明白了裏面的道理。在這裏寫出來,請高手指正。php
採集程序的思路很簡單,無非就是先打一個頁面,通常都是列表頁,取得裏面所有連接的地址,而後打開逐條連接,尋找咱們感興趣的東西,若是找到,就把它入庫或別的處理。下面以一個很簡單的例子來講說。正則表達式
首先肯定一個採集頁,通常就是列表面了。這裏目標是:http://www.php100.com/article/11/index.htm。這是一個列表頁,咱們的目的就是採集這個列表頁上所有的文章。有列表頁了,第一步先打開它,把它的內容歸入到咱們的程序中來。通常用fopen或是file_get_contents這兩個函數,咱們這裏用fopen做例子。怎麼打開它呢?很簡單:$source=fopen("http://www.php100.com/article/11/index.htm",'r');實際上已經把內容歸入到咱們的程序中來了。注意獲得的$source是一個資源,不是可處理的文本,因此再用函數fread將內容讀到一個變量中,此次就是真正的可編輯的文本了。例子:數據庫
$content=fread($source,99999);後面的數字表示字節數,填個大的就行。你用file_put_contents將$content寫入到一個文本文件,能夠看出裏面的內容其實就是網頁的源碼。獲得了網頁的源碼,咱們就要分析裏面的文章連接地址,這裏要用到正則表達式了,[推薦正則表達式教程(http://www.php100.com/article/7/all/545.1.htm)]。經過查看源代碼,咱們能夠看到裏面文章的連接地址全是這個樣子<div class="in_arttitle"><a href="http://www.php100.com/article/10/all/273.1.htm"> 將數據庫鏈接代碼封裝在函數裏,在須要讀取時調用..</a>數組
咱們就能夠寫正則表達式了,這裏正則表達式你們要注意了,如今網上有分享的過程到這步通常是執行不了的,由於正則表達式的問題,我也是嘗試了不少次 出現錯誤後才意識到的,這裏的正則應該這樣寫,外面是雙引號的狀況下里面的雙引號須要用"\"和"<\/a>"須要轉義處理:$count=preg_match_all("/<div class=\"in_arttitle\"><a href=\"(.*)\">(.*)<\/a>/iUs",$content,$art_list); 外面是單引號的狀況:$count=preg_match_all('/<div class="in_arttitle"><a href="(.*)">(.*)<\/a>/iUs',$content,$art_list); 這裏處理後的$art_list是一個二維數組,你們能夠打印出來 加深理解ide
其中二維數組$art_list[1]裏面包含的就是某個文章的連接地址。而$art_list[2]包含的就是某一文章的標題。到了這一步就能夠算成功了一半了,這裏已是二維數組下面你們能夠用foreach循環出來想要的地址或標題。函數
例如:htm
foreach ( $art_list[1] as $key=>$val ){教程
echo $val.'---'.$art_list[2][$key];資源
}get
到這裏你們就能夠看到本身想要的數據,而後再進行您須要的處理 入庫或其餘。