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语法速查表
Dec 06 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
php基础学习之变量的使用
Jun 09 PHP
PHP页面间参数传递的四种方法详解
Jun 09 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
php实现读取超大文件的方法
Jul 28 PHP
PHP输出一个等腰三角形的方法
May 12 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 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
thinkphp实现图片上传功能分享
2014/03/04 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
Python Socket编程入门教程
2014/07/11 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
django如何自己创建一个中间件
2019/07/24 Python
简述 Python 的类和对象
2020/08/21 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
测试驱动开发的主要步骤是什么
2014/12/10 面试题
五一服装活动方案
2014/01/11 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
校园环保标语
2014/06/13 职场文书
个人整改措施书面材料
2014/10/24 职场文书
法院答辩状格式
2015/05/22 职场文书
养成教育工作总结
2015/08/13 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
MySQL Server层四个日志的实现
2022/03/31 MySQL
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers