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作的文本留言本的例子(五)
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
php用正则判断是否为数字的方法
Mar 25 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
php对微信支付回调处理的方法
Aug 23 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 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
晶体管单管来复再生式收音机
2021/03/02 无线电
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP判断指定时间段的2个方法
2014/03/14 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
jQuery语法总结和注意事项小结
2012/11/11 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python实现ping指定IP的示例
2018/06/04 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
门卫人员岗位职责
2013/12/24 职场文书
学生党员公开承诺书
2014/05/28 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript