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程序?
Dec 08 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
php实现的获取网站备案信息查询代码(360)
Sep 23 PHP
浅谈php扩展imagick
Jun 02 PHP
自己写的php curl库实现整站克隆功能
Feb 12 PHP
yii2带搜索功能的下拉框实例详解
May 12 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
php防止sql注入的方法详解
Feb 20 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
php获取手机端的号码以及ip地址实例代码
Sep 12 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开发环境配置记录
2011/01/14 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
JavaScript的Cookies
2008/01/16 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Python定义一个Actor任务
2020/07/29 Python
python Cartopy的基础使用详解
2020/11/01 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
保安岗位职责
2014/02/21 职场文书
个人事迹材料范文
2014/12/29 职场文书
小学美术教学反思
2016/02/17 职场文书
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA