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
360通用php防护代码(使用操作详解)
Jun 18 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
PHP查询快递信息的方法
Mar 07 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
PHP+JQUERY操作JSON实例
Mar 23 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 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
短波的认识
2021/03/01 无线电
php 保留小数点
2009/04/21 PHP
php 执行系统命令的方法
2009/07/07 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
详解vue-resource promise兼容性问题
2017/06/20 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
Python中的日期时间处理详解
2016/11/17 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
python中嵌套函数的实操步骤
2019/02/27 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
了解一下python内建模块collections
2020/09/07 Python
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
二年级数学教学反思
2014/01/21 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
应届生面试求职信
2014/07/02 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
党风廉正建设责任书
2015/01/29 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
销售会议开幕词
2016/03/04 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
一篇文章弄懂Python中的内建函数
2021/08/07 Python
MySQL 数据表操作
2022/05/04 MySQL