php切割页面div内容的实现代码分享


Posted in PHP onJuly 31, 2012

亮点:
1、利用php也能实现对页面div的切割处理。这里的做法抛砖引玉,希望读者能够提供更加完美的解决方案。
2、切割处理方法已经封装成一个方法,可以直接引用。
3、顺便加上标签云的截取。//getWebDiv('id="taglist"','https://3water.com/tag/');

<?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,'utf-8',$charset_pos)) { 
$data = iconv('utf-8','utf-8',$data); 
}else if(stripos($data,'gb2312',$charset_pos)) { 
$data = iconv('gb2312','utf-8',$data); 
}else if(stripos($data,'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"','https://3water.com/tag/'); 
//End_php

考虑到id符号问题,id="u"由用户自己填写。
声明:此段php只针对带 id div内容的读取。
完善:匹配任意可闭合带id标签
View Code 
<?php 
header("Content-type: text/html; charset=utf-8"); 
function getWebTag($tag_id,$url=false,$tag='div',$data=false){ 
if($url !== false){ 
$data = file_get_contents( $url ); 
} 
$charset_pos = stripos($data,'charset'); 
if($charset_pos) { 
if(stripos($data,'utf-8',$charset_pos)) { 
$data = iconv('utf-8','utf-8',$data); 
}else if(stripos($data,'gb2312',$charset_pos)) { 
$data = iconv('gb2312','utf-8',$data); 
}else if(stripos($data,'gbk',$charset_pos)) { 
$data = iconv('gbk','utf-8',$data); 
} 
} 
preg_match_all('/<'.$tag.'/i',$data,$pre_matches,PREG_OFFSET_CAPTURE); //获取所有div前缀 
preg_match_all('/<\/'.$tag.'/i',$data,$suf_matches,PREG_OFFSET_CAPTURE); //获取所有div后缀 
$hit = strpos($data,$tag_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).'</'.$tag.'>'; 
break; 
} 
} 
return $hitDivString; 
} 
echo getWebTag('id="nav"','http://mail.163.com/html/mail_intro/','ul'); 
echo getWebTag('id="homeBanners"','http://mail.163.com/html/mail_intro/'); 
echo getWebTag('id="performance"','http://mail.163.com/html/mail_intro/','section'); 
//End_php

作者: Zjmainstay
PHP 相关文章推荐
获取远程文件大小的php函数
Jan 11 PHP
使用 PHPMAILER 发送邮件实例应用
Nov 07 PHP
深入php中var_dump方法的使用详解
Jun 24 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
php有效防止同一用户多次登录
Nov 19 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 PHP
用php如何解决大文件分片上传问题
Jul 07 PHP
php中数组首字符过滤功能代码
Jul 31 #PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 #PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 #PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 #PHP
php 调试利器debug_print_backtrace()
Jul 23 #PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 #PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 #PHP
You might like
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP函数常用用法小结
2010/02/08 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
js canvas实现五子棋小游戏
2021/01/22 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
python的exec、eval使用分析
2017/12/11 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python selenium firefox使用详解
2019/02/26 Python
构建高效的python requests长连接池详解
2020/05/02 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
Python修改DBF文件指定列
2020/12/19 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
应届生求职信写作技巧
2013/10/24 职场文书
团员个人的自我评价
2013/12/02 职场文书
国培远程培训感言
2014/03/08 职场文书
德语专业求职信
2014/03/12 职场文书
环境建议书
2015/02/04 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
2016国培学习心得体会
2016/01/08 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
JS中如何优雅的使用async await详解
2021/10/05 Javascript