用PHP代替JS玩转DOM的思路及示例代码


Posted in PHP onJune 15, 2014

事情的起源比较简单,我需要把一个导航页的数据整理好写入数据库。一个比较直观的方法是对html文件进行分析,通用的方法是用php的正则表达式来匹配。但是这样做开发和维护都很困难,代码可读性非常差。

导航页的数据都是规则的排列在DOM树当中的,用JS可以用几个循环轻松的对其进行操作,而且JS需要依赖浏览器,操作数据库很困难。其实PHP就有现成的类库对DOM树种的节点进行增删改查操作,在此做一些笔记。

这里涉及到2个类 DOMDocument 和 DOMXPath。

其实思路比较明确,就是通过DOMDocument将一个html file转换成DOM树的数据结构,再用DOMXPath的实例去搜索这个DOM树,拿到想要特定节点,接下来就可以对当前节点的子树进行遍历,得到想要的结果。

在当前目录下有一个这样一个导航的html文件 "./hao.html"

现在需要得到所有<a>标签的中文内容,php代码如下:

<?php 
//将html/xml文件转换成DOM树 
$dom = new DOMDocument(); 
$dom->loadHTMLFile("hao.html"); //得到所有class为fix的dl标签 
// example 1: for everything with an id 
//$elements = $xpath->query("//*[@id]"); 
// example 2: for node data in a selected id 
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']"); 
// example 3: same as above with wildcard 
//$elements = $xpath->query("*/div[@id='yourTagIdHere']"); 
$xpath = new DOMXPath($dom); 
$dls = $xpath->query('//dl[@class="fix"]'); 
foreach ($dls as $dl) { 
$spans = $dl->childNodes; 
foreach ($spans as $span) { 
echo trim($span->textContent)."\t"; 
} 
echo "\n"; 
} 
?>

输出结果如下:

注意:值得注意的一点是DOMDocument的默认编码方式是Latin,所以在处理utf编码的中文的时候,需要在<head>后面紧跟着填入

<meta http-equiv="content-type" content="text/html; charset=utf-8">

在其他位置,或者是只写上<meta content="charset=utf-8">都是不识别的哦
PHP 相关文章推荐
杏林同学录(六)
Oct 09 PHP
处理php自动反斜杠的函数代码
Jan 05 PHP
php之Memcache学习笔记
Jun 17 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
详解PHP发送邮件知识点
May 06 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
Feb 26 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 #PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 #PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 #PHP
PHPAnalysis中文分词类详解
Jun 13 #PHP
ThinkPHP缓存方法S()概述
Jun 13 #PHP
采用ThinkPHP中F方法实现快速缓存实例
Jun 13 #PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 #PHP
You might like
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
医生实习工作总结的自我评价
2013/09/27 职场文书
个人求职简历的自我评价范文
2013/10/09 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript