程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> php正則函數在采集程序中的運用

php正則函數在采集程序中的運用

編輯:PHP基礎知識
 

接上一篇,為了在抓取的頁面內容中提取我們想要的信息,我們一般要用正則來處理頁面內容結果。

比如preg_match_all 函數,可以把符合規則的內容 存到一個數組裡面。

用法:

$content=file_get_contents("http://health.china.com/html/breast/fxlan/1.html");
$pattern = "@http://www.yjbys.com/zhaopinhui/index.asp\?rq=(.*?)\">(.*?)@i";
$flag = preg_match_all($pattern,$content,$m);

這裡$flag會有兩個結果,一是沒有匹配到符合規則$pattern的內容,返回false;一是匹配到符合規則的內容,將內容存儲在數組$m裡。你可以print_r($m); 來檢查$m到底有沒有內容。

采集就是如此簡單。

當然,取得內容後的操作,就不一一說了,無非是入庫之類的操作。

在這裡要提一下如何才能提高采集效率,就是讓你的采集程序跑起來不會太占資源以至於拖垮服務器!

1.在采集程序開始前 先臨時定義一下php環境的的限制,如此可以預防跑著跑著突然停止的尴尬。同時也可預防php崩潰。

//腳本最長的運行時間
set_time_limit(180000);  
//臨時調整的php可用的內存
$r = ini_set("memory_limit","500M") ;  
//PCRE的最大回溯(backtracking)步數。貌似跟for循環的次數緊密相關
$r = ini_set("pcre.backtrack_limit","8000") ;
//PCRE的最大遞歸(recursion)深度。如果你將該值設的非常高,將可能耗盡進程的棧空間,導致PHP崩潰
$r = ini_set("pcre.recursion_limit","8000") ;  

2.多點用strpos,substr,explode,str_replace函數,而盡量少用preg_match_all,preg_match()這類正則函數,因為這類函數的效率實在不咋樣,我一般都是先用strpos,substr,explode,str_replace函數處理,實在不行,才會用preg_match_all,preg_match

最後也發一下preg_match的用法例子:

//這個表示在字符串$name中查找css字符,將匹配的個數放到$matches裡去。
preg_match("/css/", $name, $matches)  
$cont=preg_replace("/(?<=href=)([^\>]*)(?=\>)/i","", $cont); //過濾url
$cont=preg_replace( "/.*<\/script>/isU ",   "",   $cont   );//過濾掉javscript

替換所有 class=innerlink 的 a 標簽:

$content = preg_replace('/<A\s+class=innerlink.*?>(.*?)<\/A>/i', '${1}', $content); 

上面是兩個正則替換的例子。

基本上采集就這些了,而有關正則的話題,下一篇繼續…

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved