用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
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
php生成略缩图代码
Jul 16 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
PHP中使用SimpleXML检查XML文件结构实例
Jan 07 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
CI框架常用方法小结
May 17 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
PHP信号处理机制的操作代码讲解
Apr 19 PHP
laravel 解决crontab不执行的问题
Oct 22 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
我常用的几个类
2006/10/09 PHP
在javascript中对于DOM的加强
2013/04/11 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Python Flask基础教程示例代码
2018/02/07 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
Python OpenCV实现视频分帧
2019/06/01 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
Ibatis如何调用存储过程
2015/05/15 面试题
英语系本科生个人求职信
2013/09/21 职场文书
优秀教师获奖感言
2014/01/31 职场文书
药品采购员岗位职责
2014/02/08 职场文书
眼镜促销方案
2014/03/15 职场文书
自我鉴定书
2014/03/24 职场文书
团队口号大全
2014/06/06 职场文书
2014年底个人工作总结
2015/03/10 职场文书
2015学校年度工作总结
2015/05/11 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
python 逐步回归算法
2021/04/06 Python
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript