用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 相关文章推荐
ip签名探针
Oct 09 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
Linux下PHP连接Oracle数据库
Aug 20 PHP
PHP实现事件机制的方法
Jul 10 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
PHP获取类私有属性的3种方法
Sep 10 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
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python3实现弹弹球小游戏
2019/11/25 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
浅谈Python3中print函数的换行
2020/08/05 Python
Python extract及contains方法代码实例
2020/09/11 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
精灵市场:Pixie Market
2019/06/18 全球购物
2015年销售员工作总结范文
2015/04/07 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
导游词之无锡古运河
2019/11/14 职场文书