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边学边教》(01.开篇――准备工作)
Dec 13 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
PHP 递归效率分析
Nov 24 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
在PHP中使用redis
Nov 04 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
Referer原理与图片防盗链实现方法详解
Jul 03 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
python实现用户答题功能
2018/01/17 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
python3中for循环踩过的坑记录
2020/12/14 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
群众路线教育实践活动心得体会
2014/03/07 职场文书
大学生评语大全
2014/04/18 职场文书
大学新生军训方案
2014/05/03 职场文书
甘南现象心得体会
2014/09/11 职场文书
十二生肖观后感
2015/06/12 职场文书