用PHP代替JS玩转DOM

事情的起源比较简单,我需要把一个导航页的数据整理好写入数据库。一个比较直观的方法是对html文件进行分析,通用的方法是用php的正则表达式来匹配。但是这样做开发和维护都很困难,代码可读性非常差。

导航页的数据都是规则的排列在DOM树当中的,用JS可以用几个循环轻松的对其进行操作,而且JS需要依赖浏览器,操作数据库很困难。其实PHP就有现成的类库对DOM树种的节点进行增删改查操作,在此做一些笔记。

这里涉及到2个类 DOMDocument 和 DOMXPath

其实思路比较明确,就是通过DOMDocument将一个html file转换成DOM树的数据结构,再用DOMXPath的实例去搜索这个DOM树,拿到想要特定节点,接下来就可以对当前节点的子树进行遍历,得到想要的结果。

写一个最简单的demo

在当前目录下有一个这样一个导航的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代替JS玩转DOM,布布扣,bubuko.com

时间: 2024-08-01 22:53:33

用PHP代替JS玩转DOM的相关文章

读JS高性能总结——DOM编程(一)

DOM是一个与语言无关的API,它在浏览器中的借口却是用JS来实现的. 浏览器通常会把DOM和JS独立实现. 在IE中,JS的实现名是JScript,位于jscript.dll文件中,DOM实现则是mshtml.dll: Safari中的DOM和渲染则使用webkit中的WebCore来实现,JS则是有独立的JavaScriptCore引擎来实现: Google浏览器,同样使用webkit中的WebCore来渲染页面,但JS引擎则是由V8来实现: Firefox中的JS引擎名为SpiderMon

JS/jQuery判断DOM节点是否存在

JS原生判断DOM节点是否存在页面中 JavaScript原生函数没有提供判断DOM节点是否存在方法,我们通常获取DOM节点几乎都是document.getElement..方法,会返回一个object数组合集,我们可以通过object[0],object[1]这样来访问这个合集的每一个对象.既然返回的是数组合集,那么就有length属性,而length大于等于1即表示DOM节点存在页面中 代码: Object.prototype.exist = function(){ if(typeof th

【原生js】js动态添加dom,如何绑定事件

首先要明白浏览器在加载页面的时候是按顺序来加载的,这样以来就很清楚了,js动态添加dom以后,这些dom并没有绑定事件,这个时候最简单的一个办法就是:将绑定事件的方法封装到一个函数A中,在动态添加完dom以后立即执行一次函数A即可. 需要注意的是,在你可能同事需要添加许多的dom,不要添加一个就执行一次函数A,这样会增加浏览器的负载,你需要在所有dom添加完以后在执行函数A,例如你用一个for循环遍历dom组合并拼接成一个字符串,然后添加到某个父级dom里面,这个时候你需要在循环外添加一次就可以

JS的三种使用方式/CSS的三种使用方式/JS中的DOM事件模型/JS中匿名函数的书写及调用/媒体查询@media的三种使用方式

一.JS的三种使用方式 1.html标签中内嵌JS(不提倡使用.)                <button onclick="javascript:alert('你真点啊.')" > 有本事点我呀!!!!</button>                                2.HTML页面中直接使用JS:                <script type="text/javascript">        

原生js 的一些DOM/样式操作

写在前面的话: 一直写的jquery,原生的不用--写篇东西帮助自己整理记忆一下吧 ,虽然都很基础啊-- 1.js找dom对象,以及创建/删除 节点 一贯的jquery操作:$(selector) 原生的写法(列一些常用的): document.getElementsByClassName(selector) document.getElementsByTagName(selector) document.getElementById(selector)document.querySelecto

通过js添加的DOM节点的click事件绑定不上的解决方案以及IOS下click事件委派失效的解决方案

问题描述: 如以下代码所示,通过js添加的Dom节点,在其上绑定点击事件,有的时候会出现点击事件不响应的情况,按照正常的理解,js代码具有阻塞性,Dom节点添加成功之后,就可以找到该节点并绑定事件,没有道理会出现事件绑定不上的问题,但是这种情况的确是遇到了多次,问题原因有待日后深入理解,下面记载一下问题的解决方案. 解决方案: 方案一:将事件绑定直接写在行内标签上"<thead onclick='myFunction(this)' >",其中,this代表的是当前元素,是一

js 字符串转dom 和dom 转字符串

js 字符串转dom 和dom 转字符串 前言: 在javascript里面动态创建标准dom对象一般使用: var obj = document.createElement('div'); 然后再给obj设置一些属性. 但是,在实际使用过程中,有些人可能会想,要是能这样创建标准的dom对象就好了 伪代码:var obj=strToDom('<div id="div_1" class="div1">Hello World!</div>');

JS对象与Dom对象与jQuery对象之间的区别

通过问题看本质:举例:js的写法:document.getElementById('save').disabled=true;在jquery中我是这样写的 $("#save").disabled = true; //没有效果 分析:其实因为$("#save")出来的其实是jQuery对象,而不是普通DOM对象解决方法:1)用JQ写法 $("#save").attr("disabled","true"); 2

JS中获取 DOM 元素的绝对位置实例详解

在操作页面滚动和动画时经常会获取 DOM 元素的绝对位置,例如 本文 左侧的悬浮导航,当页面滚动到它以前会正常地渲染到文档流中,当页面滚动超过了它的位置,就会始终悬浮在左侧. 本文会详述各种获取 DOM 元素绝对位置 的方法以及对应的兼容性.关于如何获取 DOM 元素高度和滚动高度,请参考视口的宽高与滚动高度 一文. 概述 这些是本文涉及的 API 对应的文档和标准,供查阅: API 用途 文档 标准 offsetTop 相对定位容器的位置 MDN CSSOM View Module clien