用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 相关文章推荐
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
php 短链接算法收集与分析
Dec 30 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
Sep 29 PHP
php中explode函数用法分析
Nov 15 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
php7安装mongoDB扩展的方法分析
Aug 02 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
python执行精确的小数计算方法
2019/01/21 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
python命令行工具Click快速掌握
2019/07/04 Python
python openpyxl使用方法详解
2019/07/18 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
单身旅行者的单身假期:Just You
2018/04/08 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
本科毕业自我鉴定
2014/03/20 职场文书
教师节宣传方案
2014/05/23 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
教师岗位职责范本
2015/04/02 职场文书
付款证明格式范文
2015/06/19 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技