php使用自带dom扩展进行元素匹配的原理解析


Posted in PHP onMay 29, 2020

DOMDocument

php提供了非常好用的解析html和xml文档的扩展库DOM,使用这个库可以非常高效的进行html和xml文档的解析,它的原理就是通过寻找首尾匹配对来进行文档的解析。

从上面的分析可以看出,如果首位不匹配,可能就会导致一些错误的出现,因此,这个时候我们需要设置

libxml_use_internal_errors(true);

来进行错误的屏蔽,让它可以解析整个文档。

解析html基本用法

$dom = new \DOMDocument;
$content = htmlspecialchars_decode($content);
libxml_use_internal_errors(true);
$content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');
$dom->loadHTML($content);

$content是要解析的html字符串,其中我们对它进行了转义,因为可能含有实体集,然后我们有进行了编码的转换,因为可能文档不是utf-8格式的,会导致日文,法文等文字乱码。

获取元素

$a = $dom->getElementsByTagName('a');
$p = $dom->getElementsByTagName('p');

遍历元素

$elements = $dom->getElementsByTagName('a');
foreach ($elements as $element) {
  $element->textContent = '替换成其它的文字';
}

通过上面的循环,可以将全部a标签的文字替换掉。

元素嵌套

有些时候,html会嵌套很多层,比如

<div>
<p>
<a href="xxx" rel="external nofollow" >我是文字</a>
</p>
<p>
内容替换
</p>
</div>

如果我们想要对p标签文字进行替换的化,并且不想要替换含有子元素的内容,就是这里的a标签不想替换,下面的语句不能够解决我们的问题:

$elements = $dom->getElementsByTagName('p');
foreach ($elements as $element) {
  if($element->hasChildNodes()){
    $element->textContent = 'p标签内容替换';
  }
}

上面的代会将a标签的内容也替换掉,这不是我们想要的结果,因为hasChildNodes()这个函数表示的含有内容,无论它是标签还是文字,它都是返回true的,除非它是空标签,例如

它才会返回false.

所以我们需要自己封装一个函数进行检查是否含有嵌套标签。

function hasChild($element, $tags)
{
  foreach($tags as $v){
  $elements = $element->getElementsByTagName($v);

  if($elements->length){
  return true;
  }

  }
  return false;
}
$tags = array('title','h1','h2','h3','h4','h5','a','p','dd','img');  

$elements = $dom->getElementsByTagName('p');
foreach ($elements as $element) {
  if(hasChild($element, $tags)){
    $element->textContent = 'p标签内容替换';
  }
}

通过我们自己封装的函数,就可以判断出$dom的node节点是否含有子标签。

总结

到此这篇关于php使用自带dom扩展进行元素匹配的文章就介绍到这了,更多相关php元素匹配内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
Zend引擎的发展 [15]
Oct 09 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 PHP
PHP使用Alexa API获取网站的Alexa排名例子
Jun 12 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
学习php设计模式 php实现备忘录模式(Memento)
Dec 09 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 PHP
PHP与Web页面的交互示例详解一
Aug 04 PHP
PHP实现本地图片转base64格式并上传
May 29 #PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 #PHP
php生成短网址/短链接原理和用法实例分析
May 29 #PHP
PHP const定义常量及global定义全局常量实例解析
May 28 #PHP
PHP实现获取文件mime类型多种方法解析
May 28 #PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 #PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 #PHP
You might like
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
javascript表单正则应用
2017/02/04 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
python访问sqlserver示例
2014/02/10 Python
python中enumerate的用法实例解析
2014/08/18 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
pytorch简介
2020/11/11 Python
高级电工工作职责
2013/11/21 职场文书
2014年售票员工作总结
2014/11/19 职场文书
平安建设汇报材料
2014/12/29 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS