用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 sprintf()函数让你的sql操作更安全
Jul 23 PHP
PHP获取网站域名和地址的代码
Aug 17 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php array_flip() 删除数组重复元素
2009/01/14 PHP
php实现文件编码批量转换
2014/03/10 PHP
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
python正则表达式re模块详解
2014/06/25 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
Python 多进程和数据传递的理解
2017/10/09 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
django框架forms组件用法实例详解
2019/12/10 Python
python实现的分层随机抽样案例
2020/02/25 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
生产现场禁烟通知
2015/04/23 职场文书
公司规章制度范本
2015/08/03 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
Django rest framework如何自定义用户表
2021/06/09 Python
python前后端自定义分页器
2022/04/13 Python