用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 相关文章推荐
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
一个简洁实用的PHP缓存类完整实例
Jul 26 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
PHP中if和or运行效率对比
Dec 12 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
Apr 17 PHP
php封装的单文件(图片)上传类完整实例
Oct 18 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
Swoole扩展的6种模式深入详解
Mar 04 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
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
vue 递归组件的简单使用示例
2021/01/14 Vue.js
python进行文件对比的方法
2018/12/24 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python读写文件write和flush的实现方式
2020/02/21 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
研究生考核个人自我鉴定
2014/03/27 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
北京英语导游词
2015/02/12 职场文书
体检通知范文
2015/04/21 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
转变工作作风心得体会
2016/01/23 职场文书