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 相关文章推荐
基于mysql的bbs设计(四)
Oct 09 PHP
PHP array_multisort() 函数的深入解析
Jun 20 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
php过滤XSS攻击的函数
Nov 12 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
Laravel 前端资源配置教程
Oct 18 PHP
php post换行的方法
Feb 03 PHP
PHP常用字符串函数用法实例总结
Jun 04 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
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
php使用正则验证中文
2016/04/06 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
使用Apache的rewrite
2021/03/09 Servers
JS:window.onload的使用介绍
2013/11/13 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
Python处理Excel文件实例代码
2017/06/20 Python
python线程中同步锁详解
2018/04/27 Python
Python重新加载模块的实现方法
2018/10/16 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python批量图片处理简单示例
2019/08/06 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
清华大学自主招生自荐信
2014/01/29 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
教师自查自纠材料
2014/10/14 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
Python使用pyecharts控件绘制图表
2022/06/05 Python