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 相关文章推荐
用PHP实现文件上传二法
Oct 09 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
有关php运算符的知识大全
Nov 03 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
PHP实现阿里大鱼短信验证的实例代码
Jul 10 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
PHP的PDO预定义常量讲解
Jan 24 PHP
laravel-admin的图片删除实例
Sep 30 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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和Java的des加密解密代码分享
2014/06/26 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
php写app用的框架整理
2019/09/29 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
儿童python练习实例
2018/05/27 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
开展批评与自我批评发言材料
2014/05/15 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
初中英语教学随笔
2015/08/15 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技