1. 程式人生 > 實用技巧 >正則表示式採集網頁內容函式

正則表示式採集網頁內容函式

<?php
$content='<a href="http://www.baiduc.om">百度</a>';
$rule = '<a href="||u">|title|</a>';
$arr = preg_message($content, $rule);
print_r($arr);

/**
 按正則表示式提取需要的內容
 規定:
 |[關鍵字]|[屬性]       提取文字,其中關鍵字和屬性是可限項,屬性符佔一個字元
 *                    匹配任意文字
 關鍵字命名規範 :單詞、數字和下劃線任意組合
屬性:
 u:提取的字串是URL
 p:提取的字串是URL
 +:提取的字串可合併到關鍵字相同的內容中
返回:
  提取到的內容
 訪問:
    如果||裡面有關鍵字,則按返回陣列的鍵名為關鍵字;如果沒有關鍵字,則按所在位置訪問。
   只提取一項內容時,直接返回提取的內容
 */
function preg_message($content,$rule,$all=false){
    $result=false;
    if(!preg_match_all('#\|(?<key>[\w]*?)\|(?<mode>[up\+]?)#i', $rule,$ruleArr)) return false;
    $getArr = $ruleArr[0];
    $keyArr = $ruleArr['key'];
    $modeArr = $ruleArr['mode'];
    foreach($keyArr as $k=>$key){
        $search[]=preg_quote($getArr[$k]);
        $repalce[] = preg_replace(array('#^\|\|$#','#^\|([\w]+)#','#^\|#','#\|$#','#\|u$#i','#\|p$#i'),array('([\s\S]+?)',"(?<$key>",'(','[\s\S]+?)','[^>\'\"]+?)','[^>\'\"]+?)'),$getArr[$k]);
    }
     $rule=preg_quote($rule);
    $rule=str_replace('\*','[\s\S]*?',$rule);
    $rule=str_replace($search,$repalce,$rule);
    $rule="#$rule#i";

    if($all) preg_match_all($rule,$content,$arr);
    else preg_match($rule,$content,$arr);
    if(empty($arr) || !is_array($arr)) return false;
    if(count($getArr)==1) return $arr[1];
    foreach($keyArr as $k=>$key){
        if(empty($key)) $result[$k+1] = $arr[$k+1];
        else $result[$key]=$arr[$key];
    }
    return $result;
}
?>