用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 多个submit提交表单 处理方法
Jul 07 PHP
简单的PHP多图上传小程序代码
Jul 17 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
php如何实现数据库的备份和恢复
Nov 30 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 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/03 冲泡冲煮
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
PHP7变量处理机制修改
2021/03/09 PHP
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
精细化工应届生求职信
2013/11/17 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书