用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新手上路(二)
Oct 09 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
Oct 13 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 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中提问频率最高的11个面试题和答案
2014/09/02 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
JavaScript数字和字符串转换示例
2014/03/26 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
Python全排列操作实例分析
2018/07/24 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
详解python中的index函数用法
2019/08/06 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
股东协议书
2014/04/14 职场文书
化妆品活动策划方案
2014/05/23 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
个人欠条范本
2015/07/03 职场文书
文艺节目主持词
2015/07/06 职场文书
会议新闻稿
2015/07/17 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle
欧元符号 €
2022/02/17 杂记
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android