用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+DBM的同学录程序(3)
Oct 09 PHP
一个简单的域名注册情况查询程序
Oct 09 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
简单了解PHP编程中数组的指针的使用
Nov 30 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
Mar 28 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
PHP多进程简单实例小结
Nov 09 PHP
TP5框架页面跳转样式操作示例
Apr 05 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与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
Python的pycurl包用法简介
2015/11/13 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
车贷收入证明范本
2014/01/09 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
新学期开学标语
2014/06/30 职场文书
企业贷款委托书格式
2014/09/12 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
警察群众路线整改措施
2014/09/26 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
求职信格式范文
2015/03/19 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
运动会100米加油稿
2015/07/21 职场文书