用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 相关文章推荐
理解PHP5中static和const关键字的区别
Mar 19 PHP
解决php接收shell返回的结果中文乱码问题
Jan 23 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
PHP二维数组去重算法
Dec 17 PHP
微信公众号开发之通过接口删除菜单
Feb 20 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
Jun 05 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中实现进程间通讯
2006/10/09 PHP
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
JS类的封装及实现代码
2009/12/02 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
将python代码和注释分离的方法
2018/04/21 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
无刑事犯罪记录证明
2014/09/18 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
python和anaconda的区别
2022/05/06 Python