设为首页 收藏本站
查看: 1424|回复: 0

[经验分享] php获取页面并切割页面div内容

[复制链接]
累计签到:15 天
连续签到:1 天
发表于 2015-8-25 10:20:50 | 显示全部楼层 |阅读模式
  亮点:
  1、利用php也能实现对页面div的切割处理。这里的做法抛砖引玉,希望读者能够提供更加完美的解决方案。
  2、切割处理方法已经封装成一个方法,可以直接引用。
  3、顺便加上博客园标签云的截取。//getWebDiv('id="taglist"','http://www.cnblogs.com/Zjmainstay/tag/');


DSC0000.gif DSC0001.gif View Code


<?php
header("Content-type: text/html; charset=utf-8");
function getWebDiv($div_id,$url=false,$data=false){
if($url !== false){
$data = file_get_contents( $url );
}
$charset_pos = stripos($data,'charset');
if($charset_pos) {
if(stripos($data,'charset=utf-8',$charset_pos)) {
$data = iconv('utf-8','utf-8',$data);
}else if(stripos($data,'charset=gb2312',$charset_pos)) {
$data = iconv('gb2312','utf-8',$data);
}else if(stripos($data,'charset=gbk',$charset_pos)) {
$data = iconv('gbk','utf-8',$data);
}
}
preg_match_all('/<div/i',$data,$pre_matches,PREG_OFFSET_CAPTURE);    //获取所有div前缀
preg_match_all('/<\/div/i',$data,$suf_matches,PREG_OFFSET_CAPTURE); //获取所有div后缀
$hit = strpos($data,$div_id);
if($hit == -1) return false;    //未命中
$divs = array();    //合并所有div
foreach($pre_matches[0] as $index=>$pre_div){
$divs[(int)$pre_div[1]] = 'p';
$divs[(int)$suf_matches[0][$index][1]] = 's';   
}
//对div进行排序
$sort = array_keys($divs);
asort($sort);
$count = count($pre_matches[0]);
foreach($pre_matches[0] as $index=>$pre_div){
//<div $hit <div+1    时div被命中
if(($pre_matches[0][$index][1] < $hit) && ($hit < $pre_matches[0][$index+1][1])){
$deeper = 0;
//弹出被命中div前的div
while(array_shift($sort) != $pre_matches[0][$index][1] && ($count--)) continue;
//对剩余div进行匹配,若下一个为前缀,则向下一层,$deeper加1,
//否则后退一层,$deeper减1,$deeper为0则命中匹配,计算div长度
foreach($sort as $key){
if($divs[$key] == 'p') $deeper++;
else if($deeper == 0) {
$length = $key-$pre_matches[0][$index][1];
break;
}else {
$deeper--;
}
}
$hitDivString = substr($data,$pre_matches[0][$index][1],$length).'</div>';
break;
}
}
return $hitDivString;
}
echo getWebDiv('id="taglist"','http://www.cnblogs.com/Zjmainstay/tag/');
//End_php
  考虑到id符号问题,id="u"由用户自己填写。
  声明:此段php只针对带 id div内容的读取。
  ——————————————————————————完善:匹配任意可闭合带id标签————————————————————————————————————————————


View Code


1 <?php
2     header("Content-type: text/html; charset=utf-8");
3     function getWebTag($tag_id,$url=false,$tag='div',$data=false){
4         if($url !== false){
5             $data = file_get_contents( $url );
6         }
7         $charset_pos = stripos($data,'charset');
8         if($charset_pos) {
9             if(stripos($data,'charset=utf-8',$charset_pos)) {
10                 $data = iconv('utf-8','utf-8',$data);
11             }else if(stripos($data,'charset=gb2312',$charset_pos)) {
12                 $data = iconv('gb2312','utf-8',$data);
13             }else if(stripos($data,'charset=gbk',$charset_pos)) {
14                 $data = iconv('gbk','utf-8',$data);
15             }
16         }
17         
18         preg_match_all('/<'.$tag.'/i',$data,$pre_matches,PREG_OFFSET_CAPTURE);    //获取所有div前缀
19         preg_match_all('/<\/'.$tag.'/i',$data,$suf_matches,PREG_OFFSET_CAPTURE); //获取所有div后缀
20         $hit = strpos($data,$tag_id);
21         if($hit == -1) return false;    //未命中
22         $divs = array();    //合并所有div
23         foreach($pre_matches[0] as $index=>$pre_div){
24             $divs[(int)$pre_div[1]] = 'p';
25             $divs[(int)$suf_matches[0][$index][1]] = 's';   
26         }
27         
28         //对div进行排序
29         $sort = array_keys($divs);
30         asort($sort);
31         
32         $count = count($pre_matches[0]);
33         foreach($pre_matches[0] as $index=>$pre_div){
34             //<div $hit <div+1    时div被命中
35             if(($pre_matches[0][$index][1] < $hit) && ($hit < $pre_matches[0][$index+1][1])){
36                 $deeper = 0;
37                 //弹出被命中div前的div
38                 while(array_shift($sort) != $pre_matches[0][$index][1] && ($count--)) continue;
39                 //对剩余div进行匹配,若下一个为前缀,则向下一层,$deeper加1,
40                 //否则后退一层,$deeper减1,$deeper为0则命中匹配,计算div长度
41                 foreach($sort as $key){
42                     if($divs[$key] == 'p') $deeper++;
43                     else if($deeper == 0) {
44                         $length = $key-$pre_matches[0][$index][1];
45                         break;
46                     }else {
47                         $deeper--;
48                     }
49                 }
50                 $hitDivString = substr($data,$pre_matches[0][$index][1],$length).'</'.$tag.'>';
51                 break;
52             }
53         }
54         return $hitDivString;
55     }
56     
57     echo getWebTag('id="nav"','http://mail.163.com/html/mail_intro/','ul');
58     echo getWebTag('id="homeBanners"','http://mail.163.com/html/mail_intro/');
59     echo getWebTag('id="performance"','http://mail.163.com/html/mail_intro/','section');
60
61 //End_php
  
  修复:stripos($data,'charset=utf-8',$charset_pos) 加入charset=,避免有些gb2312格式的网页中包含utf-8造成错误。或者用户可以自行修改函数传入一个确定的charset参数。
  演示地址:parseDiv

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103919-1-1.html 上篇帖子: 在PHP中使用ASP.NET AJAX 下篇帖子: PHP实现今天是星期几的几种写法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表