Likeping

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

自己写的正则表达式提取采集网页内容函数,求人完善优化与交流!QQ:8968737

<?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;
}
?>
posted on 2012-06-16 19:16  Likeping's Blog  阅读(494)  评论(0编辑  收藏  举报