用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 相关文章推荐
聊天室php&amp;mysql(三)
Oct 09 PHP
PHP 常用函数库和一些实用小技巧
Jan 01 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
PDO::exec讲解
Jan 28 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
PHP7 list() 函数修改
Mar 09 PHP
php7中停止php-fpm服务的方法详解
May 09 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实现无限极分类图文教程
2014/11/25 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
javascript面向对象之Javascript 继承
2010/05/04 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
python3.5绘制随机漫步图
2018/08/27 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
python同步windows和linux文件
2019/08/29 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python实现打砖块游戏
2020/02/25 Python
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
教师旷工检讨书
2014/01/18 职场文书
银行委托书范本
2014/04/04 职场文书
项目建议书范文
2014/05/12 职场文书
买卖合同协议书范本
2014/10/18 职场文书
故宫的导游词
2015/01/31 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
Python访问Redis的详细操作
2021/06/26 Python
Python 实现Mac 屏幕截图详解
2021/10/05 Python
再谈python_tkinter弹出对话框创建
2022/03/20 Python