用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 相关文章推荐
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 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
解析MySql与Java的时间类型
2013/06/22 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
PDO实现学生管理系统
2020/03/21 PHP
prototype 的说明 js类
2006/09/07 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
JS实现前端页面的搜索功能
2018/06/12 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
python http接口自动化脚本详解
2018/01/02 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
python画图常规设置方式
2020/03/05 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
傲盾软件面试题
2015/08/17 面试题
驾驶员岗位职责
2014/01/29 职场文书
企业领导对照检查材料
2014/08/20 职场文书
基层工作经历证明
2015/06/19 职场文书
教师节联欢会主持词
2015/07/04 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python